3. Qu’est ce que mongoDB ?
mongoDB est une base de donnée
de type NoSQL,
sans schéma
document-oriented
4. sans-schéma
• Très utile en développements
‘agiles’ (itérations, rapidité de modifications,
flexibilité pour les développeurs)
• Supporte des fonctionnalités qui seraient, en
BDDs relationnelles :
• quasi-impossible (stockage d’éléments non finis, ex. tags)
• trop complexes pour ce qu’elles sont (migrations)
5. document-oriented
• mongoDB stocke des documents, pas de
rows
• les documents sont stockés sous forme de
JSON; binary JSON
• la syntaxe de requêtage est aussi fournie que
SQL
• le mécanisme de documents ‘embedded’
résout bon nombre de problèmes rencontrés
6. document-oriented
• Les documents sont stockés dans une
collection, en RoR = model
• une partie des ces données sont indexées
pour optimiser les performances
• un document n’est pas une poubelle !
7. stockage de données
volumineuses
• mongoDB (et autres NoSQL) sont plus
performantes pour la scalabilité horizontale
• ajout de serveurs pour augmenter la capacité
de stockage («sharding»)
• garantissant ainsi une meilleur disponibilité
• load-balancing optimisé entre les nodes
• augmentation transparente pour l’application
8. Cas pratique
• ORM devient ODM, la gem de référence mongoid
• ou : mongoMapper, DataMapper
• Création d’une application a base de NoSQL MongoDB
• rails new nosql
• edition du Gemfile
• gem ‘mongoid’
• gem ‘bson_ext’
• bundle install
• rails generate mongoid:config
13. Problematic
• We want to
• Calculate the ‘checkout’ sum of each object in our
ticket’s collection
• Be able to distribute this operation over the network
• Be fast!
• We don’t want to
• Go over all objects again when an update is made
14. Map : emit(checkout)
The ‘map’ function emit (select) every checkout value
of each object in our collection
100 42 215 73
{ { { {
“id” : 1, “id” : 2, “id” : 3, “id” : 4,
“day” : 20111017, “day” : 20111017, “day” : 20111017, “day” : 20111017,
“checkout” : 100 “checkout” : 42 “checkout” : 215 “checkout” : 73
} } } }
16. Reduce function
The ‘reduce’ function apply the algorithmic logic
for each key/value received from ‘map’ function
This function has to be ‘idempotent’ to be called
recursively or in a distributed system
reduce(k, A, B) == reduce(k, B, A)
reduce(k, A, B) == reduce(k, reduce(A, B))
18. Distributed
Since ‘map’ function emits objects to be reduced
and ‘reduce’ function processes for each emitted
objects independently, it can be distributed
through multiple workers.
map reduce
19. Logaritmic Update
For the same reason, when updating an object, we
don’t have to reprocess for each obejcts.
We can call ‘map’ function only on updated
objects.
26. > var map = function() {
... emit(null, this.checkout)
}
> var reduce = function(key, values) {
... var sum = 0
... for (var index in values) sum += values[index]
... return sum
}
30. > var map = function() {
... emit(this.date, this.checkout)
}
> var reduce = function(key, values) {
... var sum = 0
... for (var index in values) sum += values[index]
... return sum
}