présentation mongodb et mongoid
DESCRIPTION
A l'occasion de l'apéro Ruby du mois de novembre 2012 de Compiegne.rb, Vincent Tabary de Notso.fr et Aymeric Brisse de Perfect Memory ont fait une présentation du serveur NoSQL mongoDB et de la gem MongoId.TRANSCRIPT
co mp ie gn e .rb
15 no v. 20 12
MongoDB / MongoId
Présentation
Vincent Tabary Aymeric Brisse
co mp ie gn e .rb
15 no v. 20 12
1. NoSQL
2. MongoDB
3. MongoId
4. Bibliographie
co mp ie gn e .rb
15 no v. 20 12
SGBD relationnels limités :
* pour load balancing
* pour une logique de « Big Data »
SGBD démocratisé depuis 2009
Systèmes destinés à Internet
Pourquoi NoSQL ?
Ne supporte pas langage SQL
1. NoSQL
co mp ie gn e .rb
15 no v. 20 12
Basé sur le principe des tableaux associatifs
Intégre des technologies :
● clustering
● réplication
Retire certaines logiques :
● langage SQL
● stockage sous forme de matrice
Meilleures performances sur requêtes simples
1. NoSQL
co mp ie gn e .rb
15 no v. 20 12
Exemples de serveurs :
● Cassandra : Facebook, Twitter, Digg
● BigTable : Google
● CouchDB
● Redis
● Riak
● SimpleDB : Amazon
● MongoDB
1. NoSQL
co mp ie gn e .rb
15 no v. 20 12
Serveur NoSQL open source
Réplication
Sharding : répartition sur des clusters
Requêtes
Implémentation de Map/Reduce (JS)
Peut stocker des fichiers
2. MongoDB
co mp ie gn e .rb
15 no v. 20 12
Drivers disponibles pour plusieurs langages :
● Python
● Ruby
● Java
● Javascript (Node.js)
● C++
● PHP
● ...
2. MongoDB
co mp ie gn e .rb
15 no v. 20 12
MongoDB ("humongous" / “énorme”) est une
BDD open source NoSQL écrite en C++
distribuée sous license AGPL.
2. MongoDB - Présentation
co mp ie gn e .rb
15 no v. 20 12
Caractéristiques :
- BDD orienté Document : objects structurés de type
JSON sans schéma
- Indexes sur n’importe quel attribut
- Replication & High Availability, Auto-Sharding
(horizontal scale)
- Requêtes orientés document
- Updates rapides : Atomic modifiers
- Map/Reduce : Process des données et agrégations
2. MongoDB - Présentation
co mp ie gn e .rb
15 no v. 20 12
- Objets structurés au format BSON (JSON binaire), sans
schéma prédéterminé.
- Documents enregistrés dans des collections
Collection “Users” { "_id": ObjectId("4efa8d2b7d284dad101e4bc7"), "name": "James Bond", "login": "james", "age": 50, "adress": { "street" : "42 Class Street", "city": "Londres" } }
- Types : string, integer, boolean, double, null, array, object,
date, object id, binary data, regular expression.
2. MongoDB - BDD orientée Document
co mp ie gn e .rb
15 no v. 20 12
- Linked
# collection ‘users’ { "_id": ObjectId("4efa8d2b7d284dad101e4bc7"), "group_ids" : [
ObjectId("50a4f7464efbbe201a000003"),ObjectId("50a4fd234efbbedd1a00000f")
],
}
2. MongoDB - BDD orientée Document
co mp ie gn e .rb
15 no v. 20 12
- Embed (données “pré-jointes”)
# collection ‘users’ { "_id": ObjectId("4efa8d2b7d284dad101e4bc7"), "thumbnails": [ { "_id": ObjectId("4efa8d2b7d284dbc987a789c"), "url": "http://cloud.pm.com/resources/hash.jpg" }, { "_id": ObjectId("4efa8d2b7d284dbc987a789d"), "url": "http://cloud.pm.com/resources/hash2.jpg" }, ]
}
2. MongoDB - BDD orientée Document
co mp ie gn e .rb
15 no v. 20 12
- Récupérer les personnes ayant pour login “james”
> db.users.find( { login : "james" } )
- Récupérer les personnes vivant à Londres
> db.users.find( { adress.city : "Londres" } )
- Récupérer les groupes d’une personne
> var user = db.users.findOne( { _id:
ObjectId("50a4f7264efbbe201a000001") });
> db.groups.find( { _id : { $in : user.groups } });
2. MongoDB - Queries
co mp ie gn e .rb
15 no v. 20 12
- Pas de support de transactions (sharding, dead locks, etc.)
- Mais Atomic Modifiers
$set - set a particular value
$unset - delete a particular field
$inc - increment a particular value by a certain amount
$push - append a value to an array
$pushAll - append several values to an array
$pull - remove a value(s) from an existing array
$pullAll - remove several value(s) from an existing array
$bit - bitwise operations
2. MongoDB - Atomic Modifiers
co mp ie gn e .rb
15 no v. 20 12
- Augmenter le nombre de votes d’un media
> db.medias.update( { _id :
ObjectId("4efa8d2b7d284dad101e4bc7") } , { $inc :
{ votes_count : 1 } }
2. MongoDB - Atomic Modifiers
co mp ie gn e .rb
15 no v. 20 12
- Base de données relationnelles : schéma orienté
“normalisation” (3NF) - Théorique
- MongoDB : schéma orienté “usage” et “performance” -
Pratique
- Les questions à se poser :
● Embed VS Linked ?
● Combien de collections ?
● Quelles opérations atomiques sont nécessaires ?
● Quels indexes créer ?
● Comment partitionner ?
2. MongoDB - Designer sa BDD (Schéma)
co mp ie gn e .rb
15 no v. 20 12
A savoir sur MongoDB :
● Pas d'authentification par défaut
● Version 32 bits limitée à 2GO de données
● 1 document est limité à 16mo (vs 4 avt)
● Verrouillage global des données partagées
● Jusque version 2.0
● Meilleures performances en 2.2+
2. MongoDB
co mp ie gn e .rb
15 no v. 20 12
Plusieurs gems pour MongoDB :
● MongoId
● Mongo Ruby Driver, officiel
● MongoMapper
● ...
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Communauté active
Basé sur ActiveSupport
Validations
Requêtes grâce à Origin
Polymorphisme
Proche de ActiveRecord :
● has_many, belongs_to
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Pris en charge pour de nombreuses gems :
● Carrierwave-mongoid
● ActiveAdmin (patch)
● mongoid-rspec
● delayed_job_mongoid
● mongoid_session_store
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Pris en charge pour de nombreuses gems :
● Carrierwave-mongoid
● ActiveAdmin (patch)
● mongoid-rspec
● delayed_job_mongoid
● mongoid_session_store
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Gestion des documents
Gestion des documents « embedded »
Gestion des « extras »
● Caching
● Versionning
● Paranoia
Gestion de Map/Reduce
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Création d'une classe :
class User include Mongoid::Document include Mongoid::Timestamps
field :firstname, :type => String, :default => "" field :lastname, :type => String, :default => "" validates :lastname, :presence => true
has_and_belongs_to_many :projects, :inverse_of => :members embeds_many :tasks, :inverse_of => :userend
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Polymorphisme :class User include Mongoid::Document include Mongoid::Timestamps
embeds_many :tasks, :as => :ownerend
class Task include Mongoid::Document include Mongoid::Timestamps
embedded_in :owner, :polymorphic => trueend
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Requêtes :user = User.where(:firstname => 'Vincent')# #<User _id: 5060ea5fe77989e76b000001, created_at: 2012-09-24 23:18:55 UTC, updated_at: 2012-11-02 13:34:46 UTC, firstname: "Vincent", lastname: "Tabary">
User.countUser.all.count# => 5
user.tasks.count# => 4
Task.count# => 0
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Requêtes :User.in(firstname: ['Vincent']).union.in(firstname: ['Aymeric']).count# => 2
User.in(firstname: ['Vincent', 'Aymeric']).union.in(firstname: ['Aymeric', 'Paul']).count# => 1
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
Extras :class User include Mongoid::Document include Mongoid::Timestamps include Mongoid::Paranoia include Mongoid::Caching include Mongoid::VersionningEnd
3. MongoId
co mp ie gn e .rb
15 no v. 20 12
http://fr.wikipedia.org/wiki/NoSQL
http://www.mongodb.org/
http://rsmith.co/2012/11/05/mongodb-gotc...
https://www.ruby-toolbox.com...
6. Bibliographie