Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MongoDB : la base NoSQL qui réinvente la gestio...

David
November 27, 2013

MongoDB : la base NoSQL qui réinvente la gestion de données

Foursquare utilise MongoDB, Criteo utilise MongoDB…
Quelles sont les caractéristiques de cette base ? les uses cases ? Quels sont les avantages et les défauts de MongoDB ?
Pour cela, nous verrons le fonctionnement de cette base de données, la description des documents, les notions de replicat-set, sharding, mais aussi des cas d’utilisation possible en environnement BigData et NoBigData !
Et pourquoi ne pas finir en créant une petite application se basant sur MongoDB ?

David

November 27, 2013
Tweet

More Decks by David

Other Decks in Technology

Transcript

  1. Il n’y a pas si longtemps que cela, un site

    internet faisait sensation…
  2. {! "_id": "enigme1", ! "titre": "Enigme du vendredi", ! "activation":

    true! } {! "_id": "enigme1", ! "activation": true, ! "joueurs": [! { "email": "[email protected]", "score": 20 }! ], ! "indices": [! {! "contenu": "je suis ton père",! "flashcode": "111-111-1111", ! "joueurs": [ { "email": "[email protected]" } ]! } ]! }!
  3. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY

    AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  4. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY

    AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  5. {! "_id": "enigme1", ! "activation": true, ! "joueurs": [! {

    "email": "[email protected]", "score": 20 }! ], ! "indices": [! {! "contenu": "je suis ton père",! "flashcode": "111-111-1111", ! "joueurs": [ { "email": "[email protected]" } ]! } ]! }!
  6. {! "_id": "enigme1", ! "activation": true, ! "joueurs": [! {

    "email": "[email protected]", "score": 20 }! ], ! "indices": [! {! "contenu": "je suis ton père",! "flashcode": "111-111-1111", ! "joueurs": [ { "email": "[email protected]" } ]! } ]! }! jointure ?
  7. Type Exemple Int / Double / … { a: 1

    } Boolean { b: true } String { c: ‘hello’ } Array { d: [1, 2, 3] } Date {e: ISODate("2012-12-19T06:01:17.171Z") ObjectId {f: ObjectId(‘123456’)} Object {g: {a: 1, b: true}} … http://docs.mongodb.org/manual/reference/bson-types/
  8. 2

  9. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla »,
  10. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », …
  11. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … recouicoui: [ObjectId(22), ObjectId(33)]
  12. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … ! recouicoui: 2, // compteur
  13. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … ! recouicoui: [{user: {…}, {user: {…}]
  14. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … ! recouicoui: [{user: {…}, {user: {…}]
  15. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … ! recouicoui: [{user: {…} * 789013]
  16. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … ! recouicoui: [{user: {…} * 789013] > 16Mb
  17. 2

  18. { _id: ObjectId(11), user: {mail: « user1 », avatar: «

    http://…. », content: « blabla », … recouicoui: { users: [{user: {…} * 5], compteur: 789013 }
  19. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme

    du vendredi", ! "activation": true! } ✓ {! "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! } ✓
  20. {! "_id": "azerty12345", ! "activation": true,! "titre": "Enigme du vendredi"!

    } ✗ Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! } ✓ {! "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! } ✓
  21. Sous document spécifique {auteur: {nom: ‘Wursteisen’}} {! "_id": "azerty", !

    "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✗
  22. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}} {! "_id":

    "azerty", ! "auteur": {"prénom":"David", "nom":"Wursteisen"}! } ✓
  23. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}} {! "_id":

    "azerty", ! "auteur": {"prénom":"David", "nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✗
  24. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}!

    } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✓
  25. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}!

    } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Bob", "prénom":"David"}! } ✗
  26. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre":

    "Enigme du vendredi", ! "recouicoui": 50! } ✓
  27. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre":

    "Enigme du vendredi", ! "recouicoui": 50! } ✓ {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 10! } ✗
  28. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre":

    "Enigme du vendredi", ! "recouicoui": 50! } ✓ {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 10! } ✗ {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! ! } ✗
  29. Écrire un document db.collection.update(…, {prénom:’David’}) {! "_id": "azerty", ! "nom":

    "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "prénom": "David"! }
  30. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}}) {! "_id": "azerty", !

    "nom": "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "David"! }
  31. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }}) {! "_id": "azerty", !

    "nom": "wursteisen", ! "recouicoui": 5! } {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 7! }
  32. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }}) {!

    "_id": "azerty", ! "contact": ["John", "Bob"] ! } {! "_id": "azerty", ! "contact": ["John", "Bob", "Robert"] ! }
  33. { "cursor" : "<Cursor Type and Index>", "n" : <num>,

    "nscanned" : <num>, "scanAndOrder" : <boolean>, … }
  34. Cardinalité Répartition en écriture Isolation Fiabilité _id ✓ ✗ ✗

    ✗ hash(_id) ✓ ✓ ✗ ✗ user ✗ ✓ ✓ ✓
  35. Cardinalité Répartition en écriture Isolation Fiabilité _id ✓ ✗ ✗

    ✗ hash(_id) ✓ ✓ ✗ ✗ user ✗ ✓ ✓ ✓ user, time ✓ ✓ ✓ ✓