jugsummercamp 2013 - un backend nosql pour geektic avec mongodb
DESCRIPTION
JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB : recherche full text et géolocalisationTRANSCRIPT
![Page 1: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/1.jpg)
Un backend NoSQL pour Geektic avec MongoDBJug Summer Camp 2013 - La Rochelle
Sébastien PRUNIER - @sebprunierJérôme CREIGNOU - @jcreignou
![Page 2: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/2.jpg)
Geektic● Site de rencontre pour les geeks en
conférence :-)● Développé par la team “Code Story” lors de
Devoxx France 2013● Backend = local-geeks.json
https://github.com/CodeStory/code-story-geektic
![Page 3: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/3.jpg)
Geektic● Inscription via Twitter
![Page 4: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/4.jpg)
MongoDB● Base de données NoSQL, orientée
Document● Stockage JSON
{ "nom": "Zuckerberg", "prenom": "Mark", "email": "[email protected]", "ville": "Palo Alto", "likes": ["Facebook", "Tongues", "PHP"], "hate1": "Tyler Winklevoss", "hate2": "Cameron Winklevoss"}
![Page 5: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/5.jpg)
MongoDB 2.4Principales nouveautés● Text Search (beta)● GeoSpatial Indexes
○ GeoJSON○ Spherical Geometry
● Hashed Indexes○ Hashed Shard Keys
![Page 6: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/6.jpg)
Step 1 - Load Geeks● Script de chargement des geeks dans la
base Mongo● Node.js
○ Léger, simple, JSON○ Driver pour Mongo○ On aime bien :-)
![Page 7: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/7.jpg)
Step 1 - Load Geeks
var geeks = require('../../web/geeks.json'); ...
db.collection('geeks', function (err, collection) { if (err) { … } collection.insert(geeks, function (err, result) { console.log(result.length + ' geek(s) inserted !'); }); });
![Page 8: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/8.jpg)
Step 2 - Backend Mongo● Branchement du backend sur la base Mongo● Utilisation de Jongo
○ “Comme si on était dans le shell”
geeks.find("{ 'likes' : {$in : #} }", keywords).as(Geek.class)
![Page 9: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/9.jpg)
Testing● To Mock or Not To Mock ?● embedmongo-maven-plugin
○ pre-integration-tests : start mongo○ post-integration-tests : stop mongo
http://antoniogoncalves.org/2012/11/27/launching-the-nomock-movement/
![Page 10: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/10.jpg)
Step 2 - Backend Mongo
Regression detected !!● Sensibilité à la casse
○ Java ~ java
● Une piste : regexp
db.geeks.find({likes : /tests/i})
Index & Performance
![Page 11: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/11.jpg)
Step 3 - Text Search● Indexes de type “text”
db.geeks.ensureIndex({likes: 'text'})
● Requêtes○ OR : scala groovy○ PHRASE : “coder en java”○ NOT : java -scala
db.geeks.runCommand( "text", { search: "java -scala" } )
![Page 12: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/12.jpg)
Step 3 - Text Search● Support des langues
○ code ~ codingdb.geeks.runCommand("text", {search: "code", language:
"english"})
● Pertinence des résultats (Scoring)
"results" : [{ "score" : 1.1, "obj" : { … } },
{ "score" : 0.75, "obj" : { … } }, { "score" : 0.75, "obj" : { … } } ]
![Page 13: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/13.jpg)
Step 4 - Geo Localisation● Index géospatial
○ < 2.4 : “2d”○ >= 2.4 : “2dsphere”
db.geeks.ensureIndex( { location : "2dsphere" } )
vs.
![Page 14: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/14.jpg)
Step 4 - Geo Localisation● GeoJSON
○ Point○ LineString○ Polygon
● Opérateurs○ $geoWithin○ $near○ $geoIntersect
http://geojson.org/geojson-spec.html
![Page 15: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/15.jpg)
Kandinsky
![Page 16: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/16.jpg)
Step 4 - Geo Localisation● Ajout des données géographiques pour les
geeks déjà présents dans la base○ Encore du Node.js :-)
var gm = require('googlemaps'); ...
gm.geocode(geek.ville, function (err, villes) { // enrich geek });
![Page 17: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/17.jpg)
Step 4 - Geo Localisation● Requête simple
○ “Rechercher les geeks proches de Paris dans un rayon de 10 km”
db.geeks.find({ location : { $near : { $geometry : { type : "Point", coordinates : [2.35, 48.853] }, $maxDistance : 10000 } } })
![Page 18: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/18.jpg)
Step 4 - Geo Localisation● Aggregation Framework
○ “Regrouper les geeks par affinité, se situant à La Rochelle dans un rayon de 2 km”
$unwind $group$near
![Page 19: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB](https://reader034.vdocuments.us/reader034/viewer/2022051612/54c2e59a4a7959ad5c8b45f5/html5/thumbnails/19.jpg)
The endMerci pour votre attention !
● Questions ?● Réponses !● Let’s tweet !!