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.

Afin de vous faire découvrir MongoDB, je vous propose donc une série d’articles. Pour ce premier tutoriel, 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, il suffit de consulter ce post.

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. mongo 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 se faire, j’ai utilisé la commande  mongorestore  en précisant la Database cible et le nom de la collection. mongorestore

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. find

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. findOne

Recherche de documents

Utilisation de filtre simple

Pour rechercher un document, je vais avoir 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, je n’ai qu’à écrire la ligne suivante: db.films.find({"year":2012}) find avec filtre

Pour améliorer l’affichage, on peut utiliser la commande pretty. find filtre pretty

C’est mieux mais pas encore parfait. 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 je vais passer ce document comme deuxième argument de ma recherche find.

find avec filtre et projection

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.

suppression de l’id dans la projection

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 des recherches dans un tableau ? 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()

Recherche dans un tableau

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()_

Combinaison de filtre

Comment faire si je veux filtrer les films avec Leonardo DiCaprio ou Tom Hanks ? On utilise pour cela l’opérateur $in.

Recherche avec OU logique

Pour avoir uniquement les films avec Leonardo DiCaprio et Tom Hanks, il existe l’opérateur $all.

Recherche avec ET logique

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 post n’est pas d’en faire la liste exhaustive.

Nous allons simplement terminer par quelques recherches un peu plus poussée .

Les documents mongoDB peuvent contenir des documents imbriqués. Dans notre collection example, nous avons ainsi le document awards.

Document imbriqué 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.

Recheche dans un document imbriqué

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.

Recherche avec un filtre différent

Un autre exemple avec une recherche sur les films ayant remportés plus de 80 prix.

Recherche avec filtre supérieur

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 reprendre notre requête précédente et trier les résultats par ordre décroissant sur le nombre de prix obtenus.

Tri des résultats

Ceci termine ce premier tutoriel sur MongoDB. Dans un prochain article, nous étudierons les possibilités d’insertion et de mise à jour des documents.

Bonne journée à tous.