Mongo db devfestw
- 2. Agile Developer
MongoDB User
@karesti MongoDB Master
Katia Aresti Freelance
jeudi 14 mars 13
- 5. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
jeudi 14 mars 13
- 6. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
• J’ai déjà utilisé MongoDB à la maison
jeudi 14 mars 13
- 7. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
• J’ai déjà utilisé MongoDB à la maison
• J’utilise MongoDB chez mon client
jeudi 14 mars 13
- 10. «MongoDB has the best features of
key/value stores, document databases
and relational databases in one.»
John Nunemaker
jeudi 14 mars 13
- 11. «MongoDB has the best features of
key/value stores, document databases
and relational databases in one.»
John Nunemaker
jeudi 14 mars 13
- 14. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
jeudi 14 mars 13
- 15. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
jeudi 14 mars 13
- 16. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
jeudi 14 mars 13
- 17. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
• Système de requêtes très évolué
jeudi 14 mars 13
- 18. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
• Système de requêtes très évolué
jeudi 14 mars 13
- 19. La donnée normalisée
Category
• Name
• Url
Article
User • Name
Tag
• Name • Slug • Name
• Email Address • Publish date • Url
• Text
Comment
• Comment
• Date
• Author
©
jeudi 14 mars 13
- 20. Une base de données document
Article
• Name
• Slug
• Publish date
User • Text
• Name • Author
• Email Address
Comment[]
• Comment
• Date
• Author
Tag[]
• Value
Category[]
• Value
©
jeudi 14 mars 13
- 21. RDBMS Mongo
Table,View ➜ Collection
Row ➜ Document
Index ➜ Index
Join ➜ Embedded Document
Foreign Key ➜ Reference
Partition ➜ Shard
jeudi 14 mars 13
- 24. Techniquement
• Ecrit en C++
• Portable (presque) partout !
jeudi 14 mars 13
- 25. Techniquement
• Ecrit en C++
• Portable (presque) partout !
• La donnée est sérialisée en BSON
jeudi 14 mars 13
- 26. Techniquement
• Ecrit en C++
• Portable (presque) partout !
• La donnée est sérialisée en BSON
• Utilisation massive de la mémoire
jeudi 14 mars 13
- 30. Haute-Disponibilité & Scalabilité
• Réplication de server avec failover du master
automatique
• Sharding automatique
• Distribution des lectures sur les serveurs
jeudi 14 mars 13
- 31. Haute-Disponibilité & Scalabilité
• Réplication de server avec failover du master
automatique
• Sharding automatique
• Distribution des lectures sur les serveurs
jeudi 14 mars 13
- 33. Haute performance
• La plupart des opération sont faites en
mémoire.
jeudi 14 mars 13
- 34. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
jeudi 14 mars 13
- 35. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
• Indexation de n'importe quel champs ou sous-
documents
jeudi 14 mars 13
- 36. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
• Indexation de n'importe quel champs ou sous-
documents
• Ecritures asynchrones si besoin
jeudi 14 mars 13
- 42. Mission
• Les négociations ont échoué...
jeudi 14 mars 13
- 43. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
jeudi 14 mars 13
- 44. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
jeudi 14 mars 13
- 45. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
jeudi 14 mars 13
- 46. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
• ...en 2 mois...
jeudi 14 mars 13
- 47. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
• ...en 2 mois...
jeudi 14 mars 13
- 51. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
jeudi 14 mars 13
- 52. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
• N'est possible qu'en écrivant
du code de façon incremental.
jeudi 14 mars 13
- 53. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
• N'est possible qu'en écrivant
du code de façon incremental.
• Suite de tests unitaires et
fonctionnels très importantes.
jeudi 14 mars 13
- 55. Architecture •Initiale
Fort stockage
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 56. Architecture •Initiale
Fort stockage
• Rapidité de lecture
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 57. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 58. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 59. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data • Requêtes complexes
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 60. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data • Requêtes complexes
REST • Aucune écriture
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 62. Architecture Initiale
Services Data
REST
• Très fort stockage
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 63. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 64. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
• Requête simple
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 65. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
• Requête simple
XML
•
CSV
Historise la donnée SOAP
ETL
REST
...
jeudi 14 mars 13
- 69. Modélisation de données
Table GéoEntités
Nom Lat Lng
Arc de Triomphe 48.873383 2.294463
Notre-Dame 48.898734 2.302374
0,n Table Films
Film Durée Année
Persepolis 2H30 2007
Rosario 1h30 2011
jeudi 14 mars 13
- 72. Nos besoins
• Fort volume
• Pas de jointure
jeudi 14 mars 13
- 73. Nos besoins
• Fort volume
• Pas de jointure
• Pas de transactions
complexes
jeudi 14 mars 13
- 74. Nos besoins
• Fort volume
• Pas de jointure
• Pas de transactions
complexes
• Rapidité de lecture
jeudi 14 mars 13
- 75. Nos besoins
• Fort volume
• Pas de jointure
• Pas de transactions
complexes
• Rapidité de lecture
• Scalabilité horizontale
jeudi 14 mars 13
- 78. Challenge
• En 2 heures faire une lecture/écriture de
géo-entité avec MongoDB. MySQL ça serait
le temps nécessaire.
jeudi 14 mars 13
- 79. Challenge
• En 2 heures faire une lecture/écriture de
géo-entité avec MongoDB. MySQL ça serait
le temps nécessaire.
jeudi 14 mars 13
- 82. Remise en question
Fort volume de stockage Fort volume de stockage
Windows + MS SQL Server Linux
Recherche GéoSpatiale Recherche Géospatiale
Recherche sur mot clé (*) Recherche sur mot clé (*)
Réplication Réplication + Sharding
Temps de requêtes moyen Temps de requête moyen
150-300ms 40-100ms
jeudi 14 mars 13
- 85. Version 1
• L'utilisateur d'UrbanDive est en mesure de
créer des POI (POPI).
jeudi 14 mars 13
- 86. Déploiement v1 Staging
Replica Set
Secondary
ELB
Arbiter
Primary
Secondary
jeudi 14 mars 13
- 87. Version 2
• Le marketing des POIs veut faire une
recherche full-text et du scoring.
• Nous voulons créer et rechercher des
évènements
jeudi 14 mars 13
- 88. Architecture V2
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 89. Version 3
• Nombreux contenus real-time
jeudi 14 mars 13
- 90. Architecture V3
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 91. Architecture V3
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 92. Architecture V3
Services
REST
Data
...
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
- 94. Conclusions
• Expérience très positive
jeudi 14 mars 13
- 95. Conclusions
• Expérience très positive
• Prise en main très rapide
jeudi 14 mars 13
- 96. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
jeudi 14 mars 13
- 97. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
• Support gratuit et commercial
jeudi 14 mars 13
- 98. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
• Support gratuit et commercial
• Produit s'améliore en continue, point critique la suivi
en production
jeudi 14 mars 13
- 106. REST Web
Services
Search of
POI-s
jeudi 14 mars 13
- 107. API DBObject
REST Web
Services
Search of
POI-s
jeudi 14 mars 13
- 108. API DBObject
REST Web
Services
Search of
POI-s
{DBObject : "pas mal, mais ça peut
être mieux"
jeudi 14 mars 13
- 111. Morphia
JPA-LIKE
jeudi 14 mars 13
- 112. Donc ...
• Morphia ce n’est pas mal, bon travail !
jeudi 14 mars 13
- 113. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
jeudi 14 mars 13
- 114. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
jeudi 14 mars 13
- 115. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
• Morphia arrive au driver java ?
jeudi 14 mars 13
- 116. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
• Morphia arrive au driver java ?
• Notre choix : Morphia pour mapper les objets et le
Driver Java pour tout le reste.
jeudi 14 mars 13
- 118. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
jeudi 14 mars 13
- 119. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
jeudi 14 mars 13
- 120. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
jeudi 14 mars 13
- 121. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
• Pas de JPA / Hibernate
jeudi 14 mars 13
- 122. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
• Pas de JPA / Hibernate
• Requête Mongo comme dans le shell
jeudi 14 mars 13
- 123. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
jeudi 14 mars 13
- 124. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
jeudi 14 mars 13
- 125. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
jeudi 14 mars 13
- 126. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
jeudi 14 mars 13
- 127. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
jeudi 14 mars 13
- 128. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
jeudi 14 mars 13
- 129. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
jeudi 14 mars 13
- 130. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
List<User> users = new ArrayList<User>();
for (DBObject result : results) {
User user = new User();
user.setUsername((String) result.get("username"));
user.setAge((Integer) result.get("age"));
users.add(user);
}
jeudi 14 mars 13
- 131. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
jeudi 14 mars 13
- 132. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
MongoCollection collection = new Jongo(db).getCollection("users");
jeudi 14 mars 13
- 133. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
MongoCollection collection = new Jongo(db).getCollection("users");
Iterable<User> users = collection.find("{ $or : [ { age : {$gt:20,$lt:30} } , { age :
{$gt:50,$lt:60} } ] }").as(User.class);
jeudi 14 mars 13
- 134. DB db = mongo.getDB("users");
DBCollection collection = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
List<User> users = new ArrayList<User>();
for (DBObject result : results) {
User user = new User();
user.setUsername((String) result.get("username"));
user.setAge((Integer) result.get("age"));
users.add(user);
}
MongoCollection collection = new Jongo(db).getCollection("users");
Iterable<User> users = collection.find("{ $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:
50,$lt:60} } ] }").as(User.class);
jeudi 14 mars 13
- 136. db.users.update({ name : 'Joe' } ,
{ {$inc : {age : 1} },
true, true)
Jongo update
MongoCollection users = new Jongo(db).getCollection("users");
jeudi 14 mars 13
- 137. db.users.update({ name : 'Joe' } ,
{ {$inc : {age : 1} },
true, true)
Jongo update
MongoCollection users = new Jongo(db).getCollection("users");
users.update("{name: 'Joe'}").upsert().multi().with("{$inc: {age: 1}}");
jeudi 14 mars 13
- 138. Templating
MongoCollection collection = new Jongo(db).getCollection("users");
friends.find("{name: #, age: #}", "John", 18);
{name: 'John', age: 18}
jeudi 14 mars 13
- 139. Aggregation Fw
MongoCollection collection = new Jongo(db).getCollection("emails");
collection.aggregate("{$project:{sender:1}}")
.and("{$match:{tags:'read'}}")
.and("{$limit:10}")
.as(Email.class);
jeudi 14 mars 13
- 140. Conclusion
• Mongo Shell c’est un plaisir ; le driver java
peut l’être aussi
jeudi 14 mars 13
- 141. http://jongo.org/
https://github.com/bguerout/jongo
@bguerout - Benoit Guérout
@amsellemyves - Yves Amsellem
jeudi 14 mars 13