19
Un backend NoSQL pour Geektic avec MongoDB Jug Summer Camp 2013 - La Rochelle Sébastien PRUNIER - @sebprunier Jérôme CREIGNOU - @jcreignou

JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB

Embed Size (px)

DESCRIPTION

JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB : recherche full text et géolocalisation

Citation preview

Page 1: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB

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

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

Geektic● Inscription via Twitter

Page 4: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB

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

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

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

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

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

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

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

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

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

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

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

Kandinsky

Page 16: JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB

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

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

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

The endMerci pour votre attention !

● Questions ?● Réponses !● Let’s tweet !!