MongoDB

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

11/28/13

@dwursteisen

!1
MongoDB
Big Database
@DWURSTEISEN
http://fr.slideshare.net/soatexpert
WARNING
Il n’y a pas si longtemps que cela,
un site internet faisait sensation…
20:00:00
Ce site déboite
Oups ! Database Error
no more space disk available
IG
B

TA
A
D
oat
nS
tio
ima
An
013
ce 2
ran
xF
vox
De
Caractéristiques
(sous le capot)
Orienté document
{!

}

!
"enigme1",
!
"_id":
v e n d r e d i ",
du
e": "Enigme
"titr
e!
a t i o n ": t r u
"activ
{!

!
"enigme1",
!
"_id":
v e n d r e d i ",
du
e": "Enigme
"titr
e!
a t i o n ": t r u
"activ

}

{!

}!

"_id": "enig
me...
Sans schéma
CREATE TABLE example_default_now (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(100),
created TIMESTAMP DEFAUL...
CREATE TABLE example_default_now (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(100),
created TIMESTAMP DEFAUL...
Sans transaction
Transaction
Transaction
Transaction
Transaction
Transaction
Transaction
Sans transaction
Sans transaction
Sans transaction
Sans transaction
Update atomique
Sans jointure
{!

}!

"_id": "enig
me1", !
"activation"
: true, !
"joueurs": [
!
{ "email": "
john@doe.com
], !
", " s c o r e ":
20 }!
...
{!

}!

"_id": "enig
me1", !
"activation"
: true, !
"joueurs": [
!
{ "email": "
john@doe.com
], !
", " s c o r e ":
20 }!
...
Distribué
Document = 16Mb Hard Limit
Design
des structures
des données
Type

Exemple

Int / Double / …

{ a: 1 }

Boolean

{ b: true }

String

{ c: ‘hello’ }

Array

{ d: [1, 2, 3] }

Date

{e...
Organiser
les données selon leurs

Utilisations
ci gît la 

4ème forme 

normale
Question :

Structure de donnée pour
l’affichage d’un message ?
2
Auteur

2
Auteur

2

Contenu
Auteur

Contenu

2

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

!

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

!

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

!

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

!

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

!

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

Information partielle
{
_id: ObjectId(11),
user: {mail: « user1 », avatar: « http://…. »,
content: « blabla »,
…
recouicoui: {
users: [{user: {…...
Le design d’une

bonne
complexe

structure de donnée est
Query language

s
u
o
v
z
e
l
?
r
a
s
i
P
a
ç
n
a
r
F

select * from table
Le shell : mongo
Lecture
Sélection d’un document

db.collection.findOne(…)
Query
Sélection d’un document

db.collection.findOne(…)
Sélection de documents

db.collection.find(…)
Sélection et mise à jour de document

db.collection.findAndModify(…)
Champ unique

{_id: ‘azerty’}
Champ unique

{_id: ‘azerty’}
{!

"_id": "azerty", !
"titre": "Enigme du vendredi", !
"activation": true!
}

✓
Champ unique

{_id: ‘azerty’}
{!

"_id": "azerty", !
"titre": "Enigme du vendredi", !
"activation": true!

✓

"_id": "azer...
Champ unique

{_id: ‘azerty’}
{!

"_id": "azerty", !
"titre": "Enigme du vendredi", !
"activation": true!

✓

"_id": "azer...
Sous document spécifique

{auteur: {nom: ‘Wursteisen’}}
Sous document spécifique

{auteur: {nom: ‘Wursteisen’}}
{!
"_id": "azerty", !
"auteur": {"nom":"Wursteisen"}!
}

✓
Sous document spécifique

{auteur: {nom: ‘Wursteisen’}}
{!
"_id": "azerty", !
"auteur": {"nom":"Wursteisen"}!
}

✓

{!
"_id...
Sous document spécifique

{auteur: {prénom: ‘David’, nom: ‘Wursteisen’}}
Sous document spécifique

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

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

{‘auteur.nom’: ‘Wursteisen’}
Sous champ

{‘auteur.nom’: ‘Wursteisen’}
{!
"_id": "azerty", !
"auteur": {"nom":"Wursteisen"}!
}

✓
Sous champ

{‘auteur.nom’: ‘Wursteisen’}
{!
"_id": "azerty", !
"auteur": {"nom":"Wursteisen"}!
}

✓

{!
"_id": "azerty", !...
Sous champ

{‘auteur.nom’: ‘Wursteisen’}
{!
"_id": "azerty", !
"auteur": {"nom":"Wursteisen"}!
}

✓

{!
"_id": "azerty", !...
Champ unique

{recouicoui: {$gt: 20}}
Champ unique

{recouicoui: {$gt: 20}}
{!
"_id": "azerty", !
"titre": "Enigme du vendredi", !
"recouicoui": 50!
}

✓
Champ unique

{recouicoui: {$gt: 20}}
{!
"_id": "azerty", !
"titre": "Enigme du vendredi", !
"recouicoui": 50!

✓

"_id": ...
Champ unique

{recouicoui: {$gt: 20}}
{!
"_id": "azerty", !
"titre": "Enigme du vendredi", !
"recouicoui": 50!

✓

"_id": ...
Écriture
Insertion d’un document

db.collection.insert(…)
Insertion d’un document

db.collection.insert(…)

Document
Update d’un document

db.collection.update(<query>, <update>)
Update d’un document

db.collection.update(<query>, <update>)

modifier
Update de documents

db.collection.update(…, …, {multi: true})
Écrire un document

db.collection.update(…, {prénom:’David’})
Écrire un document

db.collection.update(…, {prénom:’David’})
{!
"_id": "azerty", !
"nom": "wursteisen", !
"prénom": "bob"...
Écrire un document

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

db.collection.update(…, {$set: {prénom:’David’}})
Modifier un champ

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

db.collection.update(…, {$set: {prénom:’David’}})
{!
"_id": "azerty", !
"nom": "wursteisen", !
"prénom":...
Incrémentation

db.collection.update(…, {$inc: {recouicoui: 2 }})
Incrémentation

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

db.collection.update(…, {$inc: {recouicoui: 2 }})
{!
"_id": "azerty", !
"nom": "wursteisen", !
"recouicoui...
Ajout dans un tableau

db.collection.update(…, {$push: {contact: ‘Robert’ }})
Ajout dans un tableau

db.collection.update(…, {$push: {contact: ‘Robert’ }})
{!
"_id": "azerty", !
"contact": ["John", "B...
Ajout dans un tableau

db.collection.update(…, {$push: {contact: ‘Robert’ }})
{!
"_id": "azerty", !
"contact": ["John", "B...
Index
Index simple

db.couicoui.ensureIndex({ name:1 })
Index composé

db.couicoui.ensureIndex({ name:1, date:-1 })
Géo index

db.couicoui.ensureIndex({ geo: ‘2d‘ })
Index avec Time To Live

db.couicoui.ensureIndex({ name:1 }, {expireAfterSeconds: 3600})
db.find({…}).explain()
{
"cursor" : "<Cursor Type and Index>",
"n" : <num>,
"nscanned" : <num>,
"scanAndOrder" : <boolean>,
…
}
Replica Set
Driver
Primary
Secondary

Secondary
Driver
Écriture
Primary
Secondary

Secondary
Driver
Écriture
Primary
Réplication
Secondary

Secondary
Driver
Écriture
Primary
Réplication
Secondary

Réplication
Secondary
Driver
Écriture
Primary
Réplication
Secondary

Lecture
Réplication
Secondary
Lecture

Driver
Écriture
Primary

Réplication
Secondary

Lecture
Réplication
Secondary
Primary
Secondary

Secondary
Primary
Heartbeats
Secondary

Secondary
Primary
Heartbeats
Secondary

Secondary
Primary
Secondary

Secondary
Primary
Secondary

Secondary
Primary ?
Primary
Primary

Secondary
Primary ?
Réplication

Primary

Primary

Secondary
Primary ?
Réplication

Primary

Primary

Secondary
Primary ?
Réplication

Primary
Heartbeats

Primary

Secondary
Primary ?
Réplication

Primary
Heartbeats

Primary

Secondary
Primary ?
Réplication

Secondary
Heartbeats

Primary

Secondary
Primary ?
Réplication

Secondary
Heartbeats

Primary

Secondary
Primary ?
Write Concern
notification d’écriture
collection.insert(…, WriteConcern.ACKNOWLEDGED);
!

db.getLastError();

(dépendant du driver)
w=1
collection.insert(…, WriteConcern.ACKNOWLEDGED);
!

db.getLastError();

(dépendant du driver)
w=1
collection.insert(…, WriteConcern.ACKNOWLEDGED);
!

db.getLastError();

bloquant
(dépendant du driver)
disable acknowledgment
w=0
Driver

Mongod
Driver

write
Mongod
write
Mongod

getLastError

w=0

Driver
getLastError
response

write
Mongod

getLastError

w=0

Driver
acknowledgment
w=1
Driver

Mongod
Driver

write
Mongod
write
Mongod

getLastError

w=1

Driver
write

getLastError

w=1

Driver

Mongod

apply
Mongod

apply

getLastError
response

write

getLastError

w=1

Driver
bloquant

Mongod

apply

getLastError
response

write

getLastError

w=1

Driver
journal
j=1
Driver

Mongod
Driver

write
Mongod
write
Mongod

getLastError

w=1,j=1

Driver
write

getLastError

w=1,j=1

Driver

Mongod

apply
write

getLastError

w=1,j=1

Driver

Mongod

apply

write to
journal
write to
journal

apply

getLastError
response

write

getLastError

w=1,j=1

Driver

Mongod
bloquant

write to
journal

apply

getLastError
response

write

getLastError

w=1,j=1

Driver

Mongod
replica acknowledgment
w=2
Driver

Primary

Secondary
Secondary
Driver

write
Primary

Secondary
Secondary
write
Primary

Secondary
Secondary

getLastError

w=2

Driver
write

getLastError

w=2

Driver

Primary

apply
Secondary
Secondary
write

getLastError

w=2

Driver

apply
Secondary
Secondary

replicate

Primary
write

getLastError

w=2

Driver

apply
Secondary
Secondary

replicate

Primary
apply

Secondary

replicate

Primary

getLastError
response

write
Secondary

getLastError

w=2

Driver
apply

Secondary

replicate

Primary

getLastError
response

Driver

getLastError

w=2

write
Secondary

bloquant
Secondary

replicate

apply

replicate

Primary

getLastError
response

Driver

getLastError

w=2

write
Secondary

bloqua...
Sharding

Répartition
collection
collection

Shard1

Shard2

Shard3
collection

Shard1
{x: min}

Shard2
{x: -11}

Shard3
{x: 50}

{x: max}
Avec une clé de sharding
db.collect.find({key: …})
Mongos
db.collect.find({key: …})
Mongos
db.collect.find({key: …})
Mongos
db.collect.find({key: …})
Mongos
db.collect.find({key: …})
Mongos
Avec une clé non shardé
db.collect.find({other: …})
Mongos
db.collect.find({other: …})
Mongos
db.collect.find({other: …})
Mongos
Question :

Clé de sharding pour gérer 

les messages d’un utilisateur ?
Répartition
Cardinalité
Isolation
en écriture
_id

Fiabilité
ObjectId(« 507f1f77bcf86cd799439011 »)

http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
Timestamp
ObjectId(« 507f1f77bcf86cd799439011 »)

http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-...
Timestamp
ObjectId(« 507f1f77bcf86cd799439011 »)

Host
http://www.mongodb.com/presentations/advanced-sharding-features-mon...
Timestamp

PID

ObjectId(« 507f1f77bcf86cd799439011 »)

Host
http://www.mongodb.com/presentations/advanced-sharding-featur...
Timestamp

PID

ObjectId(« 507f1f77bcf86cd799439011 »)

Host

Compteur

http://www.mongodb.com/presentations/advanced-shar...
Timestamp
ObjectId(« 507f1f77bcf86cd799439011 »)

http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-...
Répartition
Cardinalité
Isolation
en écriture
_id

✓ ✗

✗

Fiabilité

✗
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
Répartition
Cardinalité
Isolation
en écriture
_id
hash(_id)

Fiabilité

✓ ✗ ✗
✓ ✓ ✗

✗
✗
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
Répartition
Cardinalité
Isolation
en écriture
_id
hash(_id)
user

Fiabilité

✓ ✗ ✗ ✗
✓ ✓ ✗ ✗
✗ ✓ ✓ ✓
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
Répartition
Cardinalité
Isolation
en écriture
_id
hash(_id)
user
user, time

✓
✓
✗
✓

✗
✓
✓
✓

✗
✗
✓
✓

Fiabilité

✗
✗
✓
✓
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.insert({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
db.collect.find({…})
Mongos
Aller plus loin…
https://education.mongodb.com
http://www.meetup.com/Paris-MongoDB-User-Group/
Demo
https://github.com/dwursteisen/atelier-mongodb
Questions ?
@dwursteisen
Crédits photos
http://bit.ly/HNvkfZ
http://bit.ly/1hTARzS

http://bit.ly/HGb1BO

http://bit.ly/1hrvZ7z
http://bit.ly/1d5OVTr

http://bit....
http://bit.ly/HGf2Gh

http://bit.ly/1967kv2

http://bit.ly/1c6uCUA
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
Upcoming SlideShare
Loading in …5
×

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

4,700 views

Published on

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

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,700
On SlideShare
0
From Embeds
0
Number of Embeds
304
Actions
Shares
0
Downloads
188
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

  1. 1. MongoDB la base NoSQL qui réinvente la gestion de données 11/28/13 @dwursteisen !1
  2. 2. MongoDB Big Database @DWURSTEISEN
  3. 3. http://fr.slideshare.net/soatexpert
  4. 4. WARNING
  5. 5. Il n’y a pas si longtemps que cela, un site internet faisait sensation…
  6. 6. 20:00:00
  7. 7. Ce site déboite
  8. 8. Oups ! Database Error
  9. 9. no more space disk available
  10. 10. IG B TA A D
  11. 11. oat nS tio ima An 013 ce 2 ran xF vox De
  12. 12. Caractéristiques (sous le capot)
  13. 13. Orienté document
  14. 14. {! } ! "enigme1", ! "_id": v e n d r e d i ", du e": "Enigme "titr e! a t i o n ": t r u "activ
  15. 15. {! ! "enigme1", ! "_id": v e n d r e d i ", du e": "Enigme "titr e! a t i o n ": t r u "activ } {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]!
  16. 16. Sans schéma
  17. 17. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  18. 18. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  19. 19. Sans transaction
  20. 20. Transaction
  21. 21. Transaction
  22. 22. Transaction
  23. 23. Transaction
  24. 24. Transaction
  25. 25. Transaction
  26. 26. Sans transaction
  27. 27. Sans transaction
  28. 28. Sans transaction
  29. 29. Sans transaction
  30. 30. Update atomique
  31. 31. Sans jointure
  32. 32. {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]!
  33. 33. {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]! jointure ?
  34. 34. Distribué
  35. 35. Document = 16Mb Hard Limit
  36. 36. Design des structures des données
  37. 37. 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/
  38. 38. Organiser les données selon leurs Utilisations
  39. 39. ci gît la 
 4ème forme 
 normale
  40. 40. Question : Structure de donnée pour l’affichage d’un message ?
  41. 41. 2
  42. 42. Auteur 2
  43. 43. Auteur 2 Contenu
  44. 44. Auteur Contenu 2 Recouicoui
  45. 45. { _id: ObjectId(11),
  46. 46. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. »,
  47. 47. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla »,
  48. 48. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », …
  49. 49. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [ObjectId(22), ObjectId(33)] 
  50. 50. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: 2, // compteur
  51. 51. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…}, {user: {…}]
  52. 52. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…}, {user: {…}]
  53. 53. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…} * 789013]
  54. 54. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…} * 789013] > 16Mb
  55. 55. 2
  56. 56. 2 Information partielle
  57. 57. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: { users: [{user: {…} * 5], compteur: 789013 }
  58. 58. Le design d’une bonne complexe structure de donnée est
  59. 59. Query language s u o v z e l ? r a s i P a ç n a r F select * from table
  60. 60. Le shell : mongo
  61. 61. Lecture
  62. 62. Sélection d’un document db.collection.findOne(…)
  63. 63. Query Sélection d’un document db.collection.findOne(…)
  64. 64. Sélection de documents db.collection.find(…)
  65. 65. Sélection et mise à jour de document db.collection.findAndModify(…)
  66. 66. Champ unique {_id: ‘azerty’}
  67. 67. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! } ✓
  68. 68. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! ✓ "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! ✓ } {! }
  69. 69. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! ✓ "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! ✓ "_id": "azerty12345", ! "activation": true,! "titre": "Enigme du vendredi"! ✗ } {! } {! }
  70. 70. Sous document spécifique {auteur: {nom: ‘Wursteisen’}}
  71. 71. Sous document spécifique {auteur: {nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓
  72. 72. Sous document spécifique {auteur: {nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✗
  73. 73. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}}
  74. 74. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"prénom":"David", "nom":"Wursteisen"}! } ✓
  75. 75. 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"}! } ✗
  76. 76. Sous champ {‘auteur.nom’: ‘Wursteisen’}
  77. 77. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓
  78. 78. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✓
  79. 79. 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"}! } ✗
  80. 80. Champ unique {recouicoui: {$gt: 20}}
  81. 81. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 50! } ✓
  82. 82. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 50! ✓ "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 10! ✗ } {! }
  83. 83. 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", ! ✗ } {! } {! ! }
  84. 84. Écriture
  85. 85. Insertion d’un document db.collection.insert(…)
  86. 86. Insertion d’un document db.collection.insert(…) Document
  87. 87. Update d’un document db.collection.update(<query>, <update>)
  88. 88. Update d’un document db.collection.update(<query>, <update>) modifier
  89. 89. Update de documents db.collection.update(…, …, {multi: true})
  90. 90. Écrire un document db.collection.update(…, {prénom:’David’})
  91. 91. Écrire un document db.collection.update(…, {prénom:’David’}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! }
  92. 92. Écrire un document db.collection.update(…, {prénom:’David’}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "prénom": "David"! }
  93. 93. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}})
  94. 94. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! }
  95. 95. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "David"! }
  96. 96. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }})
  97. 97. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }}) {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 5! }
  98. 98. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }}) {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 5! } {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 7! }
  99. 99. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }})
  100. 100. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }}) {! "_id": "azerty", ! "contact": ["John", "Bob"] } !
  101. 101. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }}) {! "_id": "azerty", ! "contact": ["John", "Bob"] ! } {! "_id": "azerty", ! "contact": ["John", "Bob", "Robert"] } !
  102. 102. Index
  103. 103. Index simple db.couicoui.ensureIndex({ name:1 })
  104. 104. Index composé db.couicoui.ensureIndex({ name:1, date:-1 })
  105. 105. Géo index db.couicoui.ensureIndex({ geo: ‘2d‘ })
  106. 106. Index avec Time To Live db.couicoui.ensureIndex({ name:1 }, {expireAfterSeconds: 3600})
  107. 107. db.find({…}).explain()
  108. 108. { "cursor" : "<Cursor Type and Index>", "n" : <num>, "nscanned" : <num>, "scanAndOrder" : <boolean>, … }
  109. 109. Replica Set
  110. 110. Driver Primary Secondary Secondary
  111. 111. Driver Écriture Primary Secondary Secondary
  112. 112. Driver Écriture Primary Réplication Secondary Secondary
  113. 113. Driver Écriture Primary Réplication Secondary Réplication Secondary
  114. 114. Driver Écriture Primary Réplication Secondary Lecture Réplication Secondary
  115. 115. Lecture Driver Écriture Primary Réplication Secondary Lecture Réplication Secondary
  116. 116. Primary Secondary Secondary
  117. 117. Primary Heartbeats Secondary Secondary
  118. 118. Primary Heartbeats Secondary Secondary
  119. 119. Primary Secondary Secondary
  120. 120. Primary Secondary Secondary Primary ?
  121. 121. Primary Primary Secondary Primary ?
  122. 122. Réplication Primary Primary Secondary Primary ?
  123. 123. Réplication Primary Primary Secondary Primary ?
  124. 124. Réplication Primary Heartbeats Primary Secondary Primary ?
  125. 125. Réplication Primary Heartbeats Primary Secondary Primary ?
  126. 126. Réplication Secondary Heartbeats Primary Secondary Primary ?
  127. 127. Réplication Secondary Heartbeats Primary Secondary Primary ?
  128. 128. Write Concern notification d’écriture
  129. 129. collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); (dépendant du driver)
  130. 130. w=1 collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); (dépendant du driver)
  131. 131. w=1 collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); bloquant (dépendant du driver)
  132. 132. disable acknowledgment w=0
  133. 133. Driver Mongod
  134. 134. Driver write Mongod
  135. 135. write Mongod getLastError
 w=0 Driver
  136. 136. getLastError response write Mongod getLastError
 w=0 Driver
  137. 137. acknowledgment w=1
  138. 138. Driver Mongod
  139. 139. Driver write Mongod
  140. 140. write Mongod getLastError
 w=1 Driver
  141. 141. write getLastError
 w=1 Driver Mongod apply
  142. 142. Mongod apply getLastError response write getLastError
 w=1 Driver
  143. 143. bloquant Mongod apply getLastError response write getLastError
 w=1 Driver
  144. 144. journal j=1
  145. 145. Driver Mongod
  146. 146. Driver write Mongod
  147. 147. write Mongod getLastError
 w=1,j=1 Driver
  148. 148. write getLastError
 w=1,j=1 Driver Mongod apply
  149. 149. write getLastError
 w=1,j=1 Driver Mongod apply write to journal
  150. 150. write to journal apply getLastError response write getLastError
 w=1,j=1 Driver Mongod
  151. 151. bloquant write to journal apply getLastError response write getLastError
 w=1,j=1 Driver Mongod
  152. 152. replica acknowledgment w=2
  153. 153. Driver Primary Secondary Secondary
  154. 154. Driver write Primary Secondary Secondary
  155. 155. write Primary Secondary Secondary getLastError
 w=2 Driver
  156. 156. write getLastError
 w=2 Driver Primary apply Secondary Secondary
  157. 157. write getLastError
 w=2 Driver apply Secondary Secondary replicate Primary
  158. 158. write getLastError
 w=2 Driver apply Secondary Secondary replicate Primary
  159. 159. apply Secondary replicate Primary getLastError response write Secondary getLastError
 w=2 Driver
  160. 160. apply Secondary replicate Primary getLastError response Driver getLastError
 w=2 write Secondary bloquant
  161. 161. Secondary replicate apply replicate Primary getLastError response Driver getLastError
 w=2 write Secondary bloquant
  162. 162. Sharding Répartition
  163. 163. collection
  164. 164. collection Shard1 Shard2 Shard3
  165. 165. collection Shard1 {x: min} Shard2 {x: -11} Shard3 {x: 50} {x: max}
  166. 166. Avec une clé de sharding
  167. 167. db.collect.find({key: …}) Mongos
  168. 168. db.collect.find({key: …}) Mongos
  169. 169. db.collect.find({key: …}) Mongos
  170. 170. db.collect.find({key: …}) Mongos
  171. 171. db.collect.find({key: …}) Mongos
  172. 172. Avec une clé non shardé
  173. 173. db.collect.find({other: …}) Mongos
  174. 174. db.collect.find({other: …}) Mongos
  175. 175. db.collect.find({other: …}) Mongos
  176. 176. Question : Clé de sharding pour gérer 
 les messages d’un utilisateur ?
  177. 177. Répartition Cardinalité Isolation en écriture _id Fiabilité
  178. 178. ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  179. 179. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  180. 180. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») Host http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  181. 181. Timestamp PID ObjectId(« 507f1f77bcf86cd799439011 ») Host http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  182. 182. Timestamp PID ObjectId(« 507f1f77bcf86cd799439011 ») Host Compteur http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  183. 183. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  184. 184. Répartition Cardinalité Isolation en écriture _id ✓ ✗ ✗ Fiabilité ✗
  185. 185. db.collect.insert({…}) Mongos
  186. 186. db.collect.insert({…}) Mongos
  187. 187. db.collect.find({…}) Mongos
  188. 188. db.collect.find({…}) Mongos
  189. 189. db.collect.find({…}) Mongos
  190. 190. Répartition Cardinalité Isolation en écriture _id hash(_id) Fiabilité ✓ ✗ ✗ ✓ ✓ ✗ ✗ ✗
  191. 191. db.collect.insert({…}) Mongos
  192. 192. db.collect.insert({…}) Mongos
  193. 193. db.collect.insert({…}) Mongos
  194. 194. db.collect.insert({…}) Mongos
  195. 195. db.collect.find({…}) Mongos
  196. 196. db.collect.find({…}) Mongos
  197. 197. db.collect.find({…}) Mongos
  198. 198. Répartition Cardinalité Isolation en écriture _id hash(_id) user Fiabilité ✓ ✗ ✗ ✗ ✓ ✓ ✗ ✗ ✗ ✓ ✓ ✓
  199. 199. db.collect.insert({…}) Mongos
  200. 200. db.collect.insert({…}) Mongos
  201. 201. db.collect.insert({…}) Mongos
  202. 202. db.collect.insert({…}) Mongos
  203. 203. db.collect.find({…}) Mongos
  204. 204. db.collect.find({…}) Mongos
  205. 205. db.collect.find({…}) Mongos
  206. 206. Répartition Cardinalité Isolation en écriture _id hash(_id) user user, time ✓ ✓ ✗ ✓ ✗ ✓ ✓ ✓ ✗ ✗ ✓ ✓ Fiabilité ✗ ✗ ✓ ✓
  207. 207. db.collect.insert({…}) Mongos
  208. 208. db.collect.insert({…}) Mongos
  209. 209. db.collect.insert({…}) Mongos
  210. 210. db.collect.insert({…}) Mongos
  211. 211. db.collect.find({…}) Mongos
  212. 212. db.collect.find({…}) Mongos
  213. 213. db.collect.find({…}) Mongos
  214. 214. Aller plus loin…
  215. 215. https://education.mongodb.com
  216. 216. http://www.meetup.com/Paris-MongoDB-User-Group/
  217. 217. Demo
  218. 218. https://github.com/dwursteisen/atelier-mongodb
  219. 219. Questions ? @dwursteisen
  220. 220. Crédits photos
  221. 221. http://bit.ly/HNvkfZ http://bit.ly/1hTARzS http://bit.ly/HGb1BO http://bit.ly/1hrvZ7z http://bit.ly/1d5OVTr http://bit.ly/17SGXwC http://bit.ly/1awf0XL http://bit.ly/HNvRP4 http://bit.ly/MMaRr8
  222. 222. http://bit.ly/HGf2Gh http://bit.ly/1967kv2 http://bit.ly/1c6uCUA

×