MongoDB est un système de gestion de base de données ou SGBD, comme Mysql ou PostgreSql, mais dont le mécanisme est complètement différent. Fini le temps ou il fallait créer un schéma de tables relationnelles et créer des requêtes Sql complexes. Grâce à MongoDB vous allez pouvoir stocker vos données un peu comme vous le feriez dans un fichier JSON. C'est à dire, une sorte de dictionnaire géant composé de clés et de valeurs. Ces données peuvent ensuite être exploitées par du javascript, directement intégré dans MongoDB, mais peuvent également être exploitées par d'autre langage comme python.
Collection et Documents
Avant de commencer à voir en détail le fonctionnement de MongoDB, il faut comprendre différentes notions. MongoDB stocke ses données sous le même format qu'un document JSON. Pour être plus exact, c'est la version binaire du JSON appelé BSON. Mais alors, c'est quoi un document JSON ?
Documents
Un document JSON, c'est simplement un ensemble de clés et de valeurs dont la notation est la suivante :
{
"first_name": "Richard",
"last_name": "Dawkins",
"job":"ethologist",
"age": 73
}
Dans cette exemple, first_name est la clé , Richard est la valeur.
Plusieurs documents peuvent être imbriqués ensemble pour former un documents plus complexe :
{
"first_name": "Richard",
"last_name": "Dawkins",
"job":"ethologist",
"age": 73
address : {
"street":"33 panda street",
"city":"Oxford",
"country":"UK"
}
}
Il est également possible de mettre des listes :
{
"first_name": "Richard",
"last_name": "Dawkins",
"job":"ethologist",
"age": 73
books: [
{"title": "Selfish Gene", "date":"1976"},
{"title": "The blind watchmaker", "date":"1956"},
{"title":"The magic of Reality", date:"2011", "page_count":200}
]
Si vous regardez la liste de livres, vous remarquerez qu'il n'est pas nécessaire de respecter la cohérence des champs d'une base Sql. En effet, il y a deux champs title et date pour les deux premiers livres, et 3 pour le dernier.
Collection
Une collection est tous simplement un ensemble de document. On peut la comparer à une table. Par exemple, une collection de 50 auteurs contiendra 50 documents comme défini plus haut. MongoDB intègre des index notés _id unique pour chaque document.
{
"_id" : 0
"first_name": "Richard",
"last_name": "Dawkins",
},
{
"_id" : 1
"first_name": "Stephen",
"last_name": "Jay Gould",
},
{
"_id" : 2
"first_name": "François",
"last_name": "Jacob",
},
Sachez que le format JSON, provient directement du langage Javascript. D'ailleurs JSON veut dire JavaScript Object Notation. C'est pour cette raison que MongoDB utilise javascript par defaut afin de manipuler sa base.
Premier pas avec MongoDB
Installation
Si vous êtes sous Linux ubuntu :
sudo apt-get install MongoDB
Pour les autres OS, je vous invite à le télécharger depuis la page officiel
MongoDB est livré avec plusieurs binaires. On retiendra mongod le serveur, et mongo le client console.
Lancement du serveur
Sous linux, un daemon est automatiquement crée. Pour l’exécuter :
sudo /etc/init.d/mongod stop
Pour les autres, il suffit d’exécuter mongod en spécifiant un chemin de stockage:
mongod --dbpath C:/mongoData
Se connecter au serveur
Tout d'abord, exécuter le client mongo depuis votre terminal. Par défaut, il se connecte au serveur mongod en localhost sur le port 27017.
schutz@brest:~/Home$ mongo
MongoDB shell version: 2.4.9
connecting to: test
Server has startup warnings:
Sat Jun 14 13:47:38.813 [initandlisten]
Sat Jun 14 13:47:38.813 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Sat Jun 14 13:47:38.813 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal).
Sat Jun 14 13:47:38.813 [initandlisten] ** See http://dochub.MongoDB.org/core/32bit
Sat Jun 14 13:47:38.813 [initandlisten]
Afficher les bases de données
Pour afficher les bases de données disponibles, utilisez show dbs. Normalement vous devriez avoir une base local propre à mongo et une base test:
show dbs
local 0.03125GB
test (empty)
Création d'une base de donnée
Pour continuer ce tutoriel, je veux créer une base de donnée medical , et créer une collection de patients. Chaque patient sera défini par son nom, prenom et sa date de naissance. Pour créer notre première base de données :
use medical
Vous pouvez faire db pour voir la base de donnée courante. Attention, si vous faites show dbs, vous ne verrez pas encore votre base. En effet, mongo attend d'avoir du contenu pour créer votre base.
Insertion
Pour créer une collection, il suffit simplement d'ajouter un patient. Par exemple pour:
{
"nom":"Dupond",
"prenom":"Jean Claude",
"ddn": new Date('May 18, 1984')
}
Je fais simplement :
db.patients.insert({"nom":"jay gould", "prenom":"stephen", new Date('May 18, 1984')})
La collection patients se crée automatiquement lors de la première utilisation. Si vous faite maintenant :
db.patients.find()
Vous pouvez voir le document que vous venez d'ajouter. Notez que MongoDB ajoute automatiquement un _index si rien n'est spécifié.
En guise d'exemple, on va remplir notre collections en répétant cette procédure 50 fois.
for ( var i = 0 ; i<50; i++){
db.patients.insert({"nom":"jay gould" , "prenom":"stephen", "age": i})
}
Vérifions le nombre de patients :
db.patients.count()
Lister la collection
find(critère, projection)
Utiliser find() pour retourner toute la liste de la collection patients.
db.patients.find()
Pour récupérer les patients dont l'age = 5
db.patients.find({age:5})
On peut aussi utiliser des expressions régulières. Par exemple, tous les prénoms commençant par "j"
db.patients.find({prenom: /^j*/})
Pour récupérer les patients dont l'age est supérieur à 40
db.patients.find({age:{$gt:40}})
$gt est un mot clef de mongo qui veut dire greater than (supérieur à). Pour voir la liste complète c'est ici.
Pour récupérer un seul élément (le premier) , utiliser findOne
db.patients.findOne({age:{$gt:40}})
Pour récupérer les patients dont l'âge est 5 ou 10 :
db.patients.find({age:{$in:[5,10]}})
Pour récupérer uniquement certaine clé, on utilise l'argument projection de find(). Par exemple, récupérer uniquement les noms des patients dont l'âge est supérieur à 40
db.patients.find({age:{$gt:40}},{"nom":true})
Pour limiter le nombre de résultat à 3 :
db.patients.find().limit(3)
Pour ordonner la liste par âge décroissant. -1 pour décroissant et 1 pour croissant.
db.patients.find().sort(age:-1)
Modifier la collection
update(query, update, options)
Remplacer tous les prénoms stephen par boby
db.patients.update({"prenom":"stephen"},{$set:{"prenom":"boby"}},{multi:true})
Ajoute une clé sexe à tous les patients
db.patients.update({prenom:"boby"}, {$set:{sexe:"male"}}, {multi:true})
Ajoute un patient olivier s'il n'existe pas
db.patients.update({prenom:"olivier"}, {$set:{sexe:"male"}}, {upsert:true})
save(document, writeConcern)
La différence avec insert est que save, fait un update du document s'il existe déjà.
db.patient.save({"prenom":"jean claude", "nom":"Van Damme"})
Suppression
remove(query,justOne)
Supprimer tous les patients qui s'appellent olivier
db.patients.remove({prenom:"olivier"})
Supprimer la collection
db.patients.drop()
Supprimer la base de donnée
use medical
db.runCommand({dropDatabase: 1});
Conclusion
Voilà pour les bases de MongoDB. Il y a encore plein de chose à dire sur MongoDB. Comme l'agrégation des données, La réplication sur plusieurs serveurs ou la sécurité. Tous se trouve sur la documentation officiel. Dans un prochain article, je m’intéresserai cette fois à l'interface entre python et MongoDB via PyMongo. Ce sera forcement un article court :D. Il faut que je jette aussi un coup d’œil à QtMongo, une interface vers Qt/C++.
Référence
MongoDB site officiel
MongoDB Documentation
Syrinxoon Tuts
PyMongo
Ce site est versionné sur GitHub. Vous pouvez corriger des erreurs en vous rendant à cette adresse
Go Top