Vous allez découvrir ici MongoDB à travers une série de tutoriels. Nous allons aborder aujourd’hui l’installation et examiner les fonctionnalités de requêtage de la solution. MongoDB est une base de données NoSQL relativement simple à prendre en main et très riche fonctionnellement. Elle permet d’adresser les problématiques de temps réel dans un contexte Big Data (mise en cluster, haute disponibilité, tolérance aux pannes). A partir de MongoDB, on peut construire des applications web destinées à une large audience.
Dans ce premier tutoriel dédié à MongoDB, nous allons aborder l’installation et examiner les fonctionnalités de requêtage de la solution. C’est parti !
Installation
La procédure est bien décrite sur le site de l’éditeur et je vous invite à consulter la section dédiée.
Pour ma part, je vous conseille d’installer MongoDB sur une machine virtuelle et si possible via l’utilitaire Vagrant. Cela vous permettra de vous familiariser avec la solution en ayant toujours la possibilité de redémarrer sur un système vierge. C’est particulièrement utile lorsqu’on commence à aborder la partie administration.
Pour voir comment faire, consultez le tutoriel « Comment créer une machine MongoDB avec Vagrant ?« .
Premiers pas
Format de stockage de mongoDB
MongoDB est donc une base NoSQL. Les informations sont stockées dans des documents au format JSON (plus exactement BSON, une version binaire du JSON).
Le JSON est devenu en quelques années un format très populaire sur Internet. Il permet de stocker les données avec les métadonnées associées (les noms de colonnes). Un peu comme le XML mais dans un format plus compacte. Il est aujourd’hui utilisé dans nombre de technologies web dérivées du Javascript (NodeJS, AngularJS, etc.).
Création de notre première collection
MongoDB est structuré autour de 3 éléments : le document, la collection et la database.
- Une database contient une ou plusieurs collections.
- Une collection regroupe un ensemble de documents.
Nous allons démarrer le shell de MongoDB en tapant simplement la commande mongo
en ligne de commande.
Le shell propose plusieurs commandes pour manipuler ces objets :
show databases // Pour visualiser les différentes databases
use database. // Pour aller sur une database particulière
show collections // Pour visualiser les collections de la database
La commande db.nomDeMaCollection.insert
permet de créer notre premier document. Cela crée automatiquement la collection si elle n’existe pas. La commande db.nomDeMaCollection.find
permet de retrouver tous les documents d’une collection.
Vous pourrez noter l’utilisation du format JSON pour l’insertion du document.
Pour ce tutoriel, j’ai choisi de créer notre base à partir d’un dump de base. Pour ce faire, j’ai utilisé la commande mongorestore
en précisant la Database cible et le nom de la collection.
Examinons un peu cette collection. La commande db.nomDeMaCollection.count
permet de compter le nombre d’éléments de la collection. Si j’utilise la commande db.nomDeMaCollection.find
, je vois que les documents contiennent beaucoup d’informations sur les films. Par ailleurs, mongoDB limite le nombre de documents retournés afin de ne pas gaspiller les ressources du système pour afficher un résultat illisible.
Si je souhaite afficher les documents suivants, il me suffit de taper it
.
Une manière plus efficace d’afficher un résultat est de demander à Mongo de retourner un seul document avec la commande db.nomDeMaCollection.findOne
.
Recherche de documents
Utilisation de filtre simple
Pour rechercher un document, j’ai besoin de placer une condition dans ma commande find. Comment faire ?
Tout simplement en décrivant cette condition dans un document JSON.
Si je veux par exemple rechercher les films de l’année 2012, il suffit d’écrire la ligne suivante :db.films.find({"year":2012})
Pour améliorer l’affichage, on peut utiliser la commande pretty.
C’est mieux mais ce n’est pas encore parfait car le nombre de documents retournés est important et chaque document est très riche.
Projection
La projection permet de sélectionner les informations à renvoyer. Si, par exemple, je m’intéresse uniquement au titre du film, à son année de sortie et aux noms des acteurs, je vais limiter les informations retournées en précisant les champs souhaités dans un document JSON (toujours ce fameux JSON). Et, également passer ce document comme deuxième argument de ma recherche find.
Pour conserver un champ, il suffit de le préciser dans ce document et de lui affecter la valeur 1.
Les plus attentifs d’entre vous auront noté que la requête a renvoyé également le champ _id
. C’est le fonctionnement normal de la commande find qui renvoie systématiquement la clé du document.
Si l’on souhaite l’exclure, il faut le préciser dans la commande.
Recherche dans un tableau
Les documents contiennent des champs simples comme l’année ou le titre du film mais aussi des tableaux pour stockés le nom des acteurs. Comment faire alors des recherches dans un tableau ? Tout simplement de la même manière que pour un champ simple :
db.films.find({"actors":"Leonardo DiCaprio"},{"title":1,"year":1,"actors":1, _id:0}).pretty()
Je peux bien sûr combiner plusieurs filtres.
db.films.find({"actors":"Leonardo DiCaprio", "year":2002},{"title":1,"year":1,"actors":1, _id:0}).pretty()_
Comment faire si je veux filtrer les films avec Leonardo DiCaprio ou Tom Hanks ? Pour cela, on utilise alors l’opérateur $in.
Pour avoir uniquement les films avec Leonardo DiCaprio et Tom Hanks, il existe l’opérateur $all.
Recherche avancée
Le langage d’interrogation de MongoDB est extrêmement puissant. Il permet de réaliser toutes les requêtes possibles et l’objectif de ce tutoriel n’est pas d’en faire la liste exhaustive. Nous allons simplement terminer par quelques recherches un peu plus poussées.
Les documents MongoDB peuvent contenir des documents imbriqués. Dans notre collection example, nous avons ainsi le document awards
.
Peut-on faire des recherches sur des éléments de ce document ? Oui, bien entendu ! Il suffit pour cela d’utiliser la notation nomDocument.nomChamp
.
On fera attention de bien mettre cette élément entre quotes dans notre requête.
Dans toutes nos recherches, nous avons utilisé des conditions d’égalité avec l’opérateur :
.
Il n’est pas possible (contrainte JSON ?) d’utiliser les signes habituels (>, >=, <, <=, !=). MongoDB propose à la place des opérateurs dédiés ($gt, $gte, $lt, $lte, $ne). Prenons un exemple et faisons une recherche sur tous les films ayant remportés au moins un prix.
Un autre exemple avec une recherche sur les films ayant remportés plus de 80 prix.
Trier les résultats
Quand les recherches renvoient beaucoup de documents, il peut être utile de les trier.
On dispose pour cela de la fonction sort
qui va permettre de trier les résultats sur un champ par ordre croissant ou décroissant.
L’usage est très simple. Nous allons donc reprendre notre requête précédente et trier les résultats par ordre décroissant sur le nombre de prix obtenus.
Ceci termine ce premier tutoriel sur MongoDB. Dans un prochain article, nous étudierons les possibilités d’insertion et de mise à jour des documents.
A très bientôt !
👉 Retrouvez toute notre actu en temps réel en nous suivant sur LinkedIn 👈
Commentaires (8)
Votre adresse de messagerie est uniquement utilisée par Business & Decision, responsable de traitement, aux fins de traitement de votre demande et d’envoi de toute communication de Business & Decision en relation avec votre demande uniquement. En savoir plus sur la gestion de vos données et vos droits.
Super comme article, facile à comprendre et impatient pour le nouveau post :)
c'est un article clair et motivant
sauf , je veux savoir comment afficher q'un élément fils dans hiérarchie par print du python .
Merci pour le tutoriel.
J'ai utilisé mongodb avec express js. J'ai utilisé la projection pour spécifier le champ retourné mais la projection ne marche pas, find retourne toujours tous les champs, voici le code source:
dbo.collection("user").find({}, {_id:false, 'nom':true, 'prenom':true}).toArray(function(err, resultats){
if(err) res.status(500).send("Error: ressource");
console.log("==> FIN LIST");
res.status(200).send(resultats);
})
Pourriez-vous m'aider svp?