compiegne.rb 15 nov. 2012
    MongoDB / MongoId
                 Présentation




Vincent Tabary                  Aymeric Brisse
compiegne.rb 15 nov. 2012
1. NoSQL
2. MongoDB
3. MongoId
4. Bibliographie
compiegne.rb 15 nov. 2012
1. NoSQL
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
compiegne.rb 15 nov. 2012
1. NoSQL

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
compiegne.rb 15 nov. 2012
1. NoSQL
Exemples de serveurs :
●   Cassandra : Facebook, Twitter, Digg
●   BigTable : Google
●   CouchDB
●   Redis
●   Riak
●   SimpleDB : Amazon
●   MongoDB
compiegne.rb 15 nov. 2012
2. MongoDB




Serveur NoSQL open source
Réplication
Sharding : répartition sur des clusters
Requêtes
Implémentation de Map/Reduce (JS)
Peut stocker des fichiers
compiegne.rb 15 nov. 2012
2. MongoDB

Drivers disponibles pour plusieurs langages :
●   Python
●   Ruby
●   Java
●   Javascript (Node.js)
●   C++
●   PHP
●   ...
compiegne.rb 15 nov. 2012
2. MongoDB - Présentation




MongoDB ("humongous" / “énorme”) est une
BDD open source NoSQL écrite en C++
distribuée sous license AGPL.
compiegne.rb 15 nov. 2012
2. MongoDB - Présentation
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
compiegne.rb 15 nov. 2012
2. MongoDB - BDD orientée Document
- 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.
compiegne.rb 15 nov. 2012
2. MongoDB - BDD orientée Document



- Linked


  # collection ‘users’
  {
  "_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
  "group_ids" : [
        ObjectId("50a4f7464efbbe201a000003"),
        ObjectId("50a4fd234efbbedd1a00000f")
  ],
  }
compiegne.rb 15 nov. 2012
2. MongoDB - BDD orientée Document

- 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"
       },
     ]
  }
compiegne.rb 15 nov. 2012
2. MongoDB - Queries

- 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 } });
compiegne.rb 15 nov. 2012
2. MongoDB - Atomic Modifiers
- 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
compiegne.rb 15 nov. 2012
2. MongoDB - Atomic Modifiers




- Augmenter le nombre de votes d’un media


> db.medias.update( { _id :
ObjectId("4efa8d2b7d284dad101e4bc7") } , { $inc :
{ votes_count : 1 } }
compiegne.rb 15 nov. 2012
2. MongoDB - Designer sa BDD (Schéma)
- 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 ?
compiegne.rb 15 nov. 2012
2. MongoDB


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+
compiegne.rb 15 nov. 2012
3. MongoId



Plusieurs gems pour MongoDB :
●   MongoId
●   Mongo Ruby Driver, officiel
●   MongoMapper
●   ...
compiegne.rb 15 nov. 2012
3. MongoId


Communauté active
Basé sur ActiveSupport
Validations
Requêtes grâce à Origin
Polymorphisme
Proche de ActiveRecord :
●   has_many, belongs_to
compiegne.rb 15 nov. 2012
3. MongoId



Pris en charge pour de nombreuses gems :
●   Carrierwave-mongoid
●   ActiveAdmin (patch)
●   mongoid-rspec
●   delayed_job_mongoid
●   mongoid_session_store
compiegne.rb 15 nov. 2012
3. MongoId



Pris en charge pour de nombreuses gems :
●   Carrierwave-mongoid
●   ActiveAdmin (patch)
●   mongoid-rspec
●   delayed_job_mongoid
●   mongoid_session_store
compiegne.rb 15 nov. 2012
3. MongoId


Gestion des documents
Gestion des documents « embedded »
Gestion des « extras »
●   Caching
●   Versionning
●   Paranoia
Gestion de Map/Reduce
compiegne.rb 15 nov. 2012
3. MongoId

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 => :user
end
compiegne.rb 15 nov. 2012
3. MongoId

Polymorphisme :
class User
  include Mongoid::Document
  include Mongoid::Timestamps

 embeds_many :tasks, :as => :owner
end
class Task
  include Mongoid::Document
  include Mongoid::Timestamps

 embedded_in :owner, :polymorphic => true
end
compiegne.rb 15 nov. 2012
3. MongoId
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.count
User.all.count
# => 5

user.tasks.count
# => 4

Task.count
# => 0
compiegne.rb 15 nov. 2012
3. MongoId



Requêtes :
User.in(firstname:
['Vincent']).union.in(firstname:
['Aymeric']).count
# => 2

User.in(firstname: ['Vincent',
'Aymeric']).union.in(firstname: ['Aymeric',
'Paul']).count
# => 1
compiegne.rb 15 nov. 2012
3. MongoId



Extras :
class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia
  include Mongoid::Caching
  include Mongoid::Versionning
End
compiegne.rb 15 nov. 2012
6. Bibliographie




      http://fr.wikipedia.org/wiki/NoSQL
          http://www.mongodb.org/
 http://rsmith.co/2012/11/05/mongodb-gotc...
       https://www.ruby-toolbox.com...

Présentation mongoDB et mongoId

  • 1.
    compiegne.rb 15 nov.2012 MongoDB / MongoId Présentation Vincent Tabary Aymeric Brisse
  • 2.
    compiegne.rb 15 nov.2012 1. NoSQL 2. MongoDB 3. MongoId 4. Bibliographie
  • 3.
    compiegne.rb 15 nov.2012 1. NoSQL 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
  • 4.
    compiegne.rb 15 nov.2012 1. NoSQL 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
  • 5.
    compiegne.rb 15 nov.2012 1. NoSQL Exemples de serveurs : ● Cassandra : Facebook, Twitter, Digg ● BigTable : Google ● CouchDB ● Redis ● Riak ● SimpleDB : Amazon ● MongoDB
  • 6.
    compiegne.rb 15 nov.2012 2. MongoDB Serveur NoSQL open source Réplication Sharding : répartition sur des clusters Requêtes Implémentation de Map/Reduce (JS) Peut stocker des fichiers
  • 7.
    compiegne.rb 15 nov.2012 2. MongoDB Drivers disponibles pour plusieurs langages : ● Python ● Ruby ● Java ● Javascript (Node.js) ● C++ ● PHP ● ...
  • 8.
    compiegne.rb 15 nov.2012 2. MongoDB - Présentation MongoDB ("humongous" / “énorme”) est une BDD open source NoSQL écrite en C++ distribuée sous license AGPL.
  • 9.
    compiegne.rb 15 nov.2012 2. MongoDB - Présentation 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
  • 10.
    compiegne.rb 15 nov.2012 2. MongoDB - BDD orientée Document - 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.
  • 11.
    compiegne.rb 15 nov.2012 2. MongoDB - BDD orientée Document - Linked # collection ‘users’ { "_id": ObjectId("4efa8d2b7d284dad101e4bc7"), "group_ids" : [ ObjectId("50a4f7464efbbe201a000003"), ObjectId("50a4fd234efbbedd1a00000f") ], }
  • 12.
    compiegne.rb 15 nov.2012 2. MongoDB - BDD orientée Document - 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" }, ] }
  • 13.
    compiegne.rb 15 nov.2012 2. MongoDB - Queries - 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 } });
  • 14.
    compiegne.rb 15 nov.2012 2. MongoDB - Atomic Modifiers - 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
  • 15.
    compiegne.rb 15 nov.2012 2. MongoDB - Atomic Modifiers - Augmenter le nombre de votes d’un media > db.medias.update( { _id : ObjectId("4efa8d2b7d284dad101e4bc7") } , { $inc : { votes_count : 1 } }
  • 16.
    compiegne.rb 15 nov.2012 2. MongoDB - Designer sa BDD (Schéma) - 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 ?
  • 17.
    compiegne.rb 15 nov.2012 2. MongoDB 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+
  • 18.
    compiegne.rb 15 nov.2012 3. MongoId Plusieurs gems pour MongoDB : ● MongoId ● Mongo Ruby Driver, officiel ● MongoMapper ● ...
  • 19.
    compiegne.rb 15 nov.2012 3. MongoId Communauté active Basé sur ActiveSupport Validations Requêtes grâce à Origin Polymorphisme Proche de ActiveRecord : ● has_many, belongs_to
  • 20.
    compiegne.rb 15 nov.2012 3. MongoId Pris en charge pour de nombreuses gems : ● Carrierwave-mongoid ● ActiveAdmin (patch) ● mongoid-rspec ● delayed_job_mongoid ● mongoid_session_store
  • 21.
    compiegne.rb 15 nov.2012 3. MongoId Pris en charge pour de nombreuses gems : ● Carrierwave-mongoid ● ActiveAdmin (patch) ● mongoid-rspec ● delayed_job_mongoid ● mongoid_session_store
  • 22.
    compiegne.rb 15 nov.2012 3. MongoId Gestion des documents Gestion des documents « embedded » Gestion des « extras » ● Caching ● Versionning ● Paranoia Gestion de Map/Reduce
  • 23.
    compiegne.rb 15 nov.2012 3. MongoId 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 => :user end
  • 24.
    compiegne.rb 15 nov.2012 3. MongoId Polymorphisme : class User include Mongoid::Document include Mongoid::Timestamps embeds_many :tasks, :as => :owner end class Task include Mongoid::Document include Mongoid::Timestamps embedded_in :owner, :polymorphic => true end
  • 25.
    compiegne.rb 15 nov.2012 3. MongoId 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.count User.all.count # => 5 user.tasks.count # => 4 Task.count # => 0
  • 26.
    compiegne.rb 15 nov.2012 3. MongoId Requêtes : User.in(firstname: ['Vincent']).union.in(firstname: ['Aymeric']).count # => 2 User.in(firstname: ['Vincent', 'Aymeric']).union.in(firstname: ['Aymeric', 'Paul']).count # => 1
  • 27.
    compiegne.rb 15 nov.2012 3. MongoId Extras : class User include Mongoid::Document include Mongoid::Timestamps include Mongoid::Paranoia include Mongoid::Caching include Mongoid::Versionning End
  • 28.
    compiegne.rb 15 nov.2012 6. Bibliographie http://fr.wikipedia.org/wiki/NoSQL http://www.mongodb.org/ http://rsmith.co/2012/11/05/mongodb-gotc... https://www.ruby-toolbox.com...