Lab4 NoSQL
Lab4 NoSQL
Lab4 NoSQL
Attention : ce cours est une introduction à MongoDB pour tous ceux qui sont amenés à
l'utiliser. Avant d'adopter cette technologie, assurez-vous que l'utilisation d'une base NoSQL
est pertinente pour votre projet. NoSQL n'est pas adapté à tous les besoins : selon votre
projet, vous aurez plus intérêt à utiliser des bases MySQL, PostgreSQL, ou autre.
Dans un système de base de données relationnelles, les informations sont stockées par ligne dans
des tables. Ces tables sont mises en relation en utilisants des clés primaires et étrangères.
Par exemple, prenons une base de données qui contient des Acteurs et des Films :
Table Acteur:
1/11
Guide de démarrage pour utiliser MongoDb
id nom prenom
1 Johansson Scarlett
2 Phoenix Joaquim
Table Film:
id titre
1 Her
2 Avengers
Table de jointure Acteur_Film qui permet d'associer les acteurs qui ont joué un rôle dans un lm:
lm_id acteur_id
1 1
1 2
2 1
L'information est rangée dans des tables et si l'on souhaite récupérer le casting d'un lm, il faut
faire une requête SQL avec des jointures pour récupérer les bonnes lignes des tables.
Dans MongoDb, l'information est modélisée sur un document au format JSON (Javascript Object
Notation). Je détaillerai dans la suite du cours ce format. Pour vous donner un aperçu, cela peut
donner pour notre exemple 2 documents:
json
Ici pas de jointure pour récupérer le casting d'un lm, il suf t de lire le document qui nous
intéresse.
Ceux qui viennent du monde des bases de données relationnelles sont peut être choqués de voir
que les acteurs sont dupliqués. Dans le monde NoSQL, on n'hésite pas à dénormaliser le schéma de
la base de données pour favoriser les performances à la lecture. L'important est de savoir quelles
requêtes seront faites pour décider du format des documents.
Installer MongoDb
2/11
Guide de démarrage pour utiliser MongoDb
Avant d'entrer dans le vif du sujet, vous allez devoir installer mongodb.Vous pouvez trouver
MongoDb en téléchargement ici:
http://www.mongodb.org/downloads
Une fois que vous avez récupéré l'archive de MongoDb qui correspond à votre OS, vous devez
trouver 2 chiers:
mongod(.exe)
mongo(.exe)
mongod sert à démarrer le moteur de base de données tandis que mongo est un interpréteur de
commandes.
mongod
Si le démarrage est réussi, vous devez voir que le processus se lance sur le port 27017 qui est le port
par défaut utilisé par MongoDb.
mongo
Le format JSON (JavaScript Object Notation) est utilisé pour l'insertion et la restitution des
documents.
3/11
Guide de démarrage pour utiliser MongoDb
Un objet contient donc des paires clés/valeurs et ou des tableaux séparés par des virgules.
json
Sachant que la valeur d'une paire clé/valeur peut être un objet et que le tableau peut contenir des
objets, on peut ordonner les informations sur plusieurs niveaux:
json
Les documents ne sont pas directement stockés dans la base de données en JSON mais dans un
format binaire appelé BSON.
Dans les exemples ci-dessus, il n'y a que des chaines de caractères. D'autres types sont supportés:
les booléens, les nombres et null.
Avec MongoDb on a en plus les date avec ISODate que je ne détaillerai pas dans ce cours.
Maintenant que l'interprêteur de commandes est démarré, nous allons insérer un premier
document.
Il nous faut en premier lieu une base de données, appelons là openclassrooms. Pour créer cette
base de données, il suf t de dire à MongoDb que l'on souhaite l'utiliser et comme elle n'existe pas, il
va la créer tout seul:
use openclassrooms
Dans une base de données relationnelle on crée des tables pour y mettre nos données. Dans
mongodb, notre base de données contient des collections dans lesquelles on ajoute nos
documents. Une collection est donc un ensemble de documents de même nature.
Nous allons créer une collections d'acteurs. La création de la collection est implicite, elle se fait à
l'insertion du premier document.
db.acteurs.insert({nom:"Johansson", prenom:"Scarlett"})
4/11
Guide de démarrage pour utiliser MongoDb
Maintenant nous pouvons véri er que notre donnée est bien insérée:
db.acteurs.find()
On retrouve donc notre document avec en plus la propriété "_id" qui est un identi ant unique pour
le document. S'il n'est pas spéci é à l'insertion, MongoDb génère un unique ObjectId qui identi e le
document.
MongoDb est schemaless, ce qui signi e que les documents ne doivent pas tous respecter le même
format.
db.acteurs.insert({nom:"E.T.", terrien:false})
L'insertion est acceptée alors que les 2 documents n'ont en commun que la propriété nom.
Cela est très utile lorsque vous démarrez sur un nouveau projet. Souvent au début la base de
données évolue beaucoup et ça nécessite alors de faire des modi cations du schéma.
Néanmoins pour que ce soit maintenable, il faut que votre collection contienne des documents de
même type (n'allez pas mélanger des acteurs et des listes de course dans la même collection). Il
faut créer des collections différentes si ce n'est pas le cas.
Paramètres de la méthode nd
Critères de recherche
5/11
Guide de démarrage pour utiliser MongoDb
Suite à notre insertion, nous avons pu récupérer notre document en utilisant la méthode nd().
Cette méthode renvoie tout ce qu'il y a dans la base de données. Elle n'est donc pas utilisable sur
une collection qui contient beaucoup de documents.
Nous allons en créer une. Nous allons l'appeler produits. Pour cela nous allons pro ter du fait que
l'interpréteur de commandes supporte le javascript et insérer 100 000 documents :
javascript
1 for(i=1; i<=100000; i++){var dixmill = i%10000; var mill = i%1000; var cent = i%100;
db.produits.insert({compteur:i, dixmill:dixmill, mill:mill, cent:cent })}
db.produits.find()
Vous verrez une première page de résultats apparaître, si vous voulez consulter le 100 000ième
document, il vous faudra taper la commande it un grand nombre de fois.
La méthode nd prend pour premier paramètre un objet JSON qu'elle va prendre comme critère
de recherche.
db.produits.find({dixmill:9999})
Vous allez avoir tous les documents qui correspondent à dixmill = 99999.
En SQL, cela revient à faire une requête avec une clause where.
db.produits.find({compteur:19999, dixmill:9999})
A vous maintenant, que faut il écrire pour récupérer les documents qui ont pour valeur cent
= 89 et mill = 289
Si vous avez réussi vous devez avoir 100 résultats. Pour connaitre le nombre de résultats, vous
pouvez appeler la méthode count() après la méthode nd(). Par exemple
db.produit. nd({dixmill:9999}).count().
On peut aller plus loin sur le critère de recherches en ajoutant des opérandes :
6/11
Guide de démarrage pour utiliser MongoDb
Les 4 opérandes ci-dessus fonctionnent pour des nombres et des chaines de caractères.
Pour les chaines de caractères, l'ordre appliqué est l'ordre alphabétique.
Un exemple:
Vous allez récupérer tous les documents ou dixmill est inférieur à 9999 et supérieur ou égal à 9997.
Récupérez tous les produits qui ont pour leur valeur mill supérieure ou égale à 525 et la
valeur cent inférieure à 90
Si vous avez réussi, vous devez avoir 42500 résultats (en utilisant la méthode count()).
Vous savez maintenant faire une recherche simple. Nous allons voir comment ltrer les résultats.
Pour le moment, lorsque nous faisons une requête, nous récupérer les documents dans leur
ensemble. Si les documents sont volumineux, il peut être intéressant de ne récupérer que les
valeurs qui nous intéressent.
MongoDb limite la taille des documents à 16MB, ce qui est une taille important pour un
document JSON.
Si vos documents sont plus importants, vous pouvez les découper en plusieurs collections
(et vous l'aurez probablement fait avant d'approcher cette limite).
Comme dans une base relationnelle, on utilise les _id pour faire le liens entre plusieurs
collections. La différence est qu'il n'y a pas de jointure. Il vous faudra alors faire 2 requêtes.
La méthode nd() prend un deuxième paramètre qui va nous servir à récupérer les propriétés qui
nous intéressent.
Si vous faites :
text
7/11
Guide de démarrage pour utiliser MongoDb
Dans les résultats, vous n'avez plus que _id et compteur dans vos résultats. Compteur est renvoyé
parce que dans le second paramètre, vous l'avez listé avec la valeur 1. _id est systématique renvoyé.
Vous constatez qu'en premier lieu vous n'avez que les documents dont la valeur mill vaut 500. Si
vous tapez la commande it plusieurs fois, vous allez arrivez aux documents ou mill vaut 600 puis
700.
Pour faire la mise à jour d'un ou plusieurs documents, il faut utiliser la méthode update().
Comme pour la méthode nd(), le premier paramètre sert de critère de recherche pour les
documents à mettre à jour, le second va servir à dé nir la mise à jour voulue.
Ensuite faites :
text
8/11
Guide de démarrage pour utiliser MongoDb
1 db.produits.find({dixmill:666})
Vous constatez que le document avec pour compteur 666 a été mis à jour mais pas les suivants.
Pourquoi? MongoDb ne met à jour que le premier document qu'il trouve avec le critère donné. Si
vous voulez tous les mettre à jour, il faut lui dire avec la commande suivante:
text
On indique avec le paramètre multi que l'on souhaite mettre à jour tous les documents trouvés.
Vous pouvez maintenant constater en recherchant les documents avec pour valeur dixmill = 666
que le champ suspicieux vaut "why?"
Nous allons supprimer la propriété que l'on vient d'ajouter. Pour cela, nous allons utiliser $unset.
text
Ici nous indiquons que nous voulons supprimer la propriété suspicieux ajoutée au préalable.
1 db.produits.insert({compteur:100001, tab:['a','b','c']})
1 db.produits.find({compteur:100001})
Si vous consultez à nouveau ce document vous constatez que le tableau tab contient:
Pour en ajouter plusieurs d'un coup, il existe $pushAll pour ajouter un tableau de valeur.
De façon analogue avec la méthode sort, en mettant -1 on supprime les éléments dans l'autre sens.
La valeur "b" était présente dans le tableau donc il n'y pas eu d'ajout.
Supprimer un document
La suppression d'un document se fait grâce à la méthode remove.
Par exemple:
text
1 db.produits.remove({mill: 600})
Supprime tous les documents qui ont pour pour valeur 600 à la propriété mill.
Conclusion
Ce cours qui vous donne un premier éclairage sur MongoDb est terminé, merci de l'avoir suivi,
j'espère qu'il vous permettra de démarrer sur l'utilisation de mongodb.
10/11