Introduction à la base de données NoSQL MongoDB

Harry Wanki

Vous avez déjà sûrement entendu parler du NoSQL et des SGBD comme CASSANDRA. En informatique, NoSQL (Not only SQL en anglais) désigne une catégorie de systèmes de gestion de bases de données (SGBD) qui n'est plus fondée sur l'architecture classique des bases relationnelles. L'unité logique n'y est plus la table, et les données ne sont en général pas manipulées avec SQL.

Parmi les nombreux SGBD faisant partie de la mouvance NoSQL se trouve MongoDB. MongoDB (de l'anglais humongous qui peut être traduit par « énorme ») est un système de gestion de bases de données orientées documents, répartissables sur un nombre quelconque d'ordinateurs et ne nécessitant pas de schéma prédéfini des données. Il est écrit en C++ et distribué sous licence AGPL.

Le but de ce tutoriel est de nous donner les notions de base pour l'utilisation de ce SGBD de manière générale.

- Titre : Introduction à la base de données NoSQL MongoDB

- Auteur : Harry Wanki

- Parution : 15 septembre 2015

- Mise à jour : 22 septembre 2015

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2015 Harry Wanki. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Installation et exécution de MongoDB sur Windows

- II-A. Préliminaires

- II-B. Téléchargement de MongoDB pour Windows

- II-C. Installation de MongoDB

- II-C-1. Installation interactive

- II-C-2. Installation automatique

- II-D. Exécution de MongoDB

- II-D-1. Configuration de l'environnement MongoDB

- II-D-2. Lancement de MongoDB

- II-D-3. Connexion à MongoDB

- II-D-4. Remarque

- II-E. Création d'un service Windows manuellement pour MongoDB

- III. Premiers pas avec MongoDB

- III-A. Connexion à la base de données

- III-A-1. Lancement de mongod

- III-A-2. Sélection d'une base de données

- III-B. Création d'une collection et insertion de documents

- IV. Un peu de pratique

- IV-A. Création de données de test

- IV-A-1. Insertion de plusieurs documents en utilisant une boucle « for »

- IV-A-2. Insertion de plusieurs documents en utilisant une fonction JavaScript

- IV-B. Utilisation de l'objet « Cursor »

- IV-B-1. Utilisation d'une boucle pour parcourir un objet « cursor »

- IV-B-2. Utilisation d'un objet « cursor » comme un tableau

- IV-C. Requête pour l'obtention d'un document spécifique

- IV-D. Obtention d'un document unique d'une collection

- IV-E. Limiter le nombre de documents du résultat d'une requête

- V. Conclusion

- VI. Remerciements

I - Introduction

D'après Wikipédia, MongoDB est développé depuis 2007 par MongoDB. Cette entreprise travaillait alors sur un système de Cloud computing, informatique à données largement réparties, similaire au service Google App Engine de Google. Sa première version considérée comme industriellement viable a été la 1.4, en 2010.

MongoDB est une base de données open source orientée documents qui fournit de hautes performances, une haute disponibilité, et mise à l'échelle automatique.

Un enregistrement dans MondoDB est un document, qui est une structure de données champ-valeur. Les documents dans MondoDB sont similaires à des objets JSON. Les valeurs d'un champ peuvent inclure d'autres documents, des tableaux, ou même des tableaux de documents.

{
matricule:  “08p037”,
nom:  “Frank”,
classe:  “3GI”,
club:  [“sport”,  “music”, “journal”]
}

Dans ce tutoriel, nous allons aborder les préliminaires sur l'utilisation de MondoDB, notamment son installation, son exécution, la création d'enregistrements, et les requêtes de base.

II - Installation et exécution de MongoDB sur Windows

MongoDB fonctionne sur plusieurs plates-formes, que ce soit en architecture 32-bits comme en architecture 64-bits.

Dans ce tutoriel, nous nous limiterons à son installation sur la plate-forme Windows. Depuis la version 2.2, MongoDB ne supporte pas Windows XP ; il serait ainsi préférable d'utiliser une version plus récente.

II-A - Préliminaires

Avant d'installer MongoDB, il est très important de savoir quelle version est compatible avec la version de Windows utilisée.

On peut obtenir la version de Windows utilisée en ouvrant l'invite de commande et en tapant les deux commandes suivantes :

wmic os get caption
wmic os get osarchitecture

La première nous donne la version de Windows (Windows 7, Windows 8…) et la seconde nous donne l'architecture (32-bits, 64-bits).

Cela peut aussi s'obtenir en cliquant sur Ordinateur dans le menu démarrer (ou sur PC pour Windows 8.1) ou dans l'explorateur de fichiers avec le bouton droit, puis bouton gauche sur Propriétés.

II-B - Téléchargement de MongoDB pour Windows

Téléchargez la dernière version de MongoDB sur la page des téléchargements MongoDB. Bien s'assurer de télécharger la version qui correspond à la version de Windows utilisée.

II-C - Installation de MongoDB

II-C-1 - Installation interactive

En double-cliquant sur le fichier .msi téléchargé, on obtient la fenêtre suivante :

Suivez les étapes d'installation en cliquant sur « Suivant » (« Next » en anglais).

Validez les termes de la licence et cliquez sur « Next ».

En cliquant sur « Complete », les paramètres d'installation seront définis par défaut.

Cliquez sur « Custom » pour une installation personnalisée.

Il est possible à ce niveau de :

- spécifier les composants qui devront être installés ;

- spécifier le répertoire d'installation.

Dans ce document, nous allons seulement modifier le répertoire d'installation et laisser le reste inchangé.

Cliquez donc sur « Browse » et choisissez le répertoire que vous souhaitez, ou laissez sans changement si le répertoire actuel vous convient.

Cliquez ensuite sur « Next » pour poursuivre l'installation.

Cliquez sur « Install » pour poursuivre l'installation. Vous n'avez plus qu'à attendre jusqu'à obtenir la fenêtre suivante :

Cliquez sur « Finish » pour terminer l'installation.

II-C-2 - Installation automatique

Sous Windows, l'installation automatique de MongoDB se fait en utilisant l'outil « Windows Installer » via l'invite de commandes.

Positionnez-vous sur le répertoire du fichier .msi.

La commande est la suivante :

msiexec.exe /q /i mongodb-<version>-signed.msi INSTALLLOCATION="<installation directory>" ADDLOCAL=<binary set(s)>

- « mongodb-<version>-signed.msi » correspond au nom du fichier .msi.

- « INSTALLLOCATION » permet de spécifier le répertoire d'installation en modifiant la valeur « <installation directory> ».

- « ADDLOCAL » qui est un argument facultatif permet de spécifier les fichiers binaires à installer.

La valeur « <binary set(s)> » est une liste d'éléments séparés par des virgules parmi ceux-ci :

- Server - inclut mongod.exe ;

- Client - inclut mongo.exe ;

- MonitoringTools - inclut mongostat.exe et mongotop.exe ;

- ImportExportTools - inclut mongodump.exe, mongorestore.exe, mongoexport.exe, et mongoimport.exe ;

- MiscellaneousTools - inclut bsondump.exe, mongofiles.exe, mongooplog.exe, et mongoperf.exe.

La valeur « ALL » permet d'installer tous les fichiers binaires suscités.

Le tableau suivant donne une brève description de ces fichiers binaires :

Fichier binaire

Description

mongod

mongod est le processus démon primaire pour le système MongoDB. Il gère les requêtes sur les données, l'accès aux données.

mongo

mongo est un service de routage MongoDB qui exécute les requêtes de la couche application.

mongostat

L'utilitaire mongostat fournit un aperçu rapide de l'état d'une instance de mongod ou mongos en cours d'exécution.

mongotop

mongotop fournit une méthode pour suivre le temps que met une instance MongoDB pour la lecture et l'écriture des données.

mongodump

mongodump est un utilitaire permettant de créer une exportation binaire du contenu de la base de données.

mongorestore

Mongorestore remplit une base de données à partir d'un contenu binaire créé par mongodump.

mongoexport

mongoexport est un utilitaire qui effectue une exportation JSON ou CSV des données stockées dans une instance MongoDB.

mongoimport

Mongoimport importe les données d'un fichier JSON, CSV ou TSV vers une base de données.

bsondump

bsondump convertit les fichiers BSON et JSON dans des formats lisibles par l'homme.

mongofiles

L'utilitaire mongofiles permet de manipuler des fichiers stockés dans une instance MongoDB sous forme d'objets GridFS via l'invite de commande.

mongooplog

Mongooplog est un outil utilisé pour copier les entrées « oplog » d'un serveur distant vers un serveur local.

mongoperf

mongoperf est un utilitaire permettant de vérifier les performances du disque I/O indépendamment de MongoDB.

II-D - Exécution de MongoDB

Pour la suite, nous supposons que notre répertoire d'installation de MongoDB est C:\mongodb.

II-D-1 - Configuration de l'environnement MongoDB

MongoDB nécessite un répertoire pour stocker toutes les données. Par défaut, le chemin relatif de ce répertoire (à partir de notre répertoire d'installation) est \data\db. Créons ce répertoire en invite de commandes, en tapant la commande :

md \data\db

On obtient le répertoire c:\data\db.

Vous pouvez spécifier un autre chemin pour les fichiers de données en utilisant l'option --dbpath à mongod.exe, par exemple :

C:\mongodb\bin\mongod.exe --dbpath "C:\test\mongodb\data"

II-D-2 - Lancement de MongoDB

Pour lancer MongoDB, exécutez le fichier mongod.exe. Via l'invite de commandes, exécutez la commande suivante :

C:\mongodb\bin\mongod.exe

Ceci lance le processus de la base de données MongoDB. Le message « waiting for connections » sur l'invite de commandes indique que le processus mongod.exe a bien été exécuté.

Un message d'alerte de sécurité peut apparaître, autorisez l'accès pour continuer.

Notez aussi que, en désactivant l'UAC, ce message d'alerte de sécurité n'apparaîtra plus.

II-D-3 - Connexion à MongoDB

Pour se connecter à MongoDB, ouvrez une autre fenêtre d'invite de commandes et tapez la commande suivante :

C:\mongodb\bin\mongo.exe

Pour arrêter MongoDB, appuyez sur Control + C dans le terminal où l'instance de mongoDB est lancée.

II-D-4 - Remarque

L'exécution d'une commande de MongoDB se fait via l'invite de commandes en utilisant le chemin absolu de la commande, ou alors en ouvrant l'invite de commandes dans le répertoire C:\mongodb\bin\.

Pour accéder aux commandes MongoDB sans chemin absolu via une invite de commandes pointant sur n'importe quel répertoire, il suffit d'ajouter le chemin « C:\mongodb\bin\. » dans le PATH, en se référant au post suivant.

II-E - Création d'un service Windows manuellement pour MongoDB

La création d'un service Windows pour MongoDB permet le lancement automatique de celui-ci au démarrage du système.

Les étapes suivantes permettent de créer un service Windows pour MongoDB :

1. Ouvrir une fenêtre d'invite de commande en tant qu'Administrateur ;

2. Créer les répertoires pour la base de données et les logs :

mkdir c:\data\db
mkdir c:\data\log

3. Créer un fichier de configuration :

echo logpath=c:\data\log\mongod.log> "C:\mongodb\mongod.cfg"
echo dbpath=c:\data\db>> "C:\mongodb\mongod.cfg"

4. Créer le service MondoDB: sc.exe create MongoDB binPath= "\"C:\mongodb\bin\mongod.exe\" --service --config=\"C:\mongodb\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
Si le service a été créé, le message suivant apparaît : [SC] CreateService SUCCESS ;

5. Pour lancer le service MondoDB : net start MongoDB ;

6. Pour arrêter le service MondoDB : net stop MongoDB ;

7. Pour supprimer le service MongoDB : sc.exe delete MongoDB.

La suppression du service n'est possible que si celui-ci est au préalable arrêté.

III - Premiers pas avec MongoDB

III-A - Connexion à la base de données

III-A-1 - Lancement de mongod

mongod est le processus démon primaire pour le système MongoDB. Il traite les requêtes sur les données, gère l'accès aux données, et effectue des opérations de traitement en arrière-plan.

Lancez mongo via une invite de commandes en tapant la commande suivante : mongo

La connexion ne peut réussir que si le service MongoDB est lancé.

Par défaut, mongo recherche un serveur de base de données sur le port 27017 sur l'interface locale. Pour se connecter à un serveur sur un port ou une interface différente, utilisez les paramètres --port et --host.

III-A-2 - Sélection d'une base de données

Après le lancement de mongo, votre session va utiliser par défaut la base de données « test ».

1. Pour avoir le nom de la base de données courante, tapez db.

2. Pour avoir la liste des bases de données, tapez show dbs.

3. Pour changer de base de données : use <database>.

4. Pour afficher l'aide : Help.

III-B - Création d'une collection et insertion de documents

Dans cette section, nous allons utiliser la base de données « bdtest », et insérer des documents dans une collection « testdata ».

Pour créer cette base de données, il suffit de dire à MongoDb que l'on souhaite l'utiliser et comme elle n'existe pas, il va la créer tout seul :

1. Tapez la commande suivante : User bdtest ;

2. Créez deux documents j et k en utilisant la séquence d'opérations JavaScript suivante :

j = { name : "mongo" }
k = { x : 3 }

3. Insérez les documents j et k dans la collection testdata via les commandes suivantes :

db.testData.insert( j )
db.testData.insert( k )

1. On peut confirmer l'existence de la collection testdata via la commande suivante : show collections
Cette commande retourne la liste des collections présentes dans la base de données bdtest. Actuellement, une seule collection est présente, il s'agit bien de notre collection testdata ;

2. On peut confirmer l'existence des documents créés dans la collection testdata en faisant une requête sur la collection en utilisant la méthode find() : db.testData.find().
Cette requête retourne les deux documents que nous avons créés précédemment :

{ "_id" : ObjectId("552be16d2c5d807571ef3fd0"), "name" : "mongo" }
{ "_id" : ObjectId("552be1732c5d807571ef3fd1 "), "x" : 3 }

Tout document MongoDB doit avoir un champ « _id » avec une valeur unique. Lors de la création de nos documents, nous n'avons pas spécifié de valeur pour le champ _id, alors mongo a créé une valeur « ObjectId » unique pour le champ _id (pour chacun des documents) avant d'insérer les documents dans la collection. Vous avez pu ainsi constater que mes valeurs de _id sont différentes des vôtres.

IV - Un peu de pratique

Dans cette section, nous allons effectuer des traitements plus avancés. Pour cela, nous aurons besoin, pour un début, de créer un ensemble de données de test.

IV-A - Création de données de test

Dans cette partie, nous allons générer des données de test de deux façons :

IV-A-1 - Insertion de plusieurs documents en utilisant une boucle « for »

Il est possible de générer des données de test en utilisant une boucle for. À partir du Shell mongo, tapez la commande suivante :

for (var i = 1; i <= 10; i++) {
db.testData.insert( { x : i } )
}

Si la collection testData n'existe pas, elle sera créée automatiquement.

On peut vérifier que les documents ont bien été créés en utilisant la requête « find() » : db.testData.find().

IV-A-2 - Insertion de plusieurs documents en utilisant une fonction JavaScript

Les données précédentes peuvent être générées en utilisant une fonction JavaScript :

function insertData(dbName, colName, num) {
var col = db.getSiblingDB(dbName).getCollection(colName);
for (i = 0; i < num; i++) {
col.insert({x:i});
}
print(col.count());
}

Cette fonction prend trois paramètres :

- la base de données ;

- le nom de la collection (existante ou non) ;

- le nombre de documents à créer.

Par exemple : insertData("bdtest", "testData", 15).

Cette fonction doit être introduite dans le fichier « .mongorc.js ».

Nous reviendrons sur cette partie lorsque nous parlerons de l'administration de MongoDB, ce qui fera sûrement l'objet d'un nouveau tutoriel.

IV-B - Utilisation de l'objet « Cursor »

Lorsqu'on interroge une collection, MongoDB retourne un objet « cursor » qui contient les résultats de la requête. Le shell mongo parcourt donc le cursor pour afficher les résultats. Au lieu de retourner tous les résultats au même moment, le shell parcourt le cursor pour afficher dans un premier temps les 20 premiers résultats. Sur le shell mongo, c'est en entrant la commande it qu'on demande au shell d'afficher la suite des résultats.

IV-B-1 - Utilisation d'une boucle pour parcourir un objet « cursor »

Pour cette partie, veuillez insérer plusieurs documents dans la collection en utilisant l'une des méthodes de génération de données de test vues précédemment.

1. Dans le shell MongoDB, faites une requête sur la collection testData en affectant l'objet cursor à une variable c : var c = db.testData.find();

2. Affichez l'ensemble des résultats en utilisant une boucle while pour parcourir le contenu de la variable c contenant notre objet cursor : while ( c.hasNext() ) printjson( c.next() ).

Vous obtenez ainsi la liste des documents contenus dans la collection testData.

La méthode « hasNext() » retourne « true » si l'objet « cursor » contient encore des documents.

La méthode « next() » affiche le document suivant.

La méthode printjson() affiche les documents sous un format JSON-like.

IV-B-2 - Utilisation d'un objet « cursor » comme un tableau

Il est possible de manipuler un objet « cursor » comme s'il était un tableau :

1-      Faites une requête sur la collection testData en affectant le résultat dans une variable :

var c = db.testData.find()

2-      Affichons par exemple le sixième élément : printjson( c [ 6 ] )

NB : lorsqu'on accède aux documents d'un objet « cursor » en utilisant la notation index des tableaux, mongo appelle dans un premier temps la méthode « cursor.toArray() » et charge les documents retournés dans la RAM. L'indexation est ainsi effectuée sur le tableau obtenu.

Pour de très grands volumes de données, mongo peut ainsi manquer de mémoire.

IV-C - Requête pour l'obtention d'un document spécifique

Il est possible sur MongoDB d'effectuer des requêtes avec paramètres pour obtenir un document spécifique. L'obtention de documents spécifiques se fait en interrogeant la collection en utilisant un « document de requête » comme paramètre à la méthode « find() ».

Dans notre cas : retrouvons les documents ayant 7 pour valeur de x, par exemple. La requête est la suivante :

db.testData.find( { x : 7 } )

Le critère « x a pour valeur 7 » se traduit par le paramètre suivant : { x : 7 }.

On obtient ainsi le résultat correspondant à notre critère :

IV-D - Obtention d'un document unique d'une collection

La méthode « findOne() » permet d'obtenir un résultat unique à partir d'une collection MongoDB.

La méthode « findOne() » prend les mêmes paramètres que la méthode « find() », mais retourne un document au lieu d'un objet « cursor ».

La commande suivante permet d'obtenir un document de la collection testData :

db.testData.findOne()

IV-E - Limiter le nombre de documents du résultat d'une requête

Pour des raisons de performance, il est possible le réduire la taille du résultat en limitant le nombre de données à retourner via une requête.

La méthode « limit() » appliquée à un « cursor » permet de spécifier le nombre maximum de documents à retourner. Par exemple :

db.testData.find().limit(3)

Le résultat obtenu est le suivant :

V - Conclusion

Ce tutoriel portait sur l'introduction à l'utilisation de MongoDB. Les bases de données NoSQL, notamment MondoDB, sont très utilisées de nos jours. Il est donc très important de se familiariser avec au moins l'une d'elles.

Dans les prochains tutoriels, nous verrons notamment les opérations avancées sur MongoDB, l'administration de MongoDB, comment construire des applications en C#, Java en utilisant MongoDB comme base de données.

VI - Remerciements

Ce document est inspiré de la documentation officielle de MongoDB.

Je tiens à remercier Francis Walter pour son assistance et ses conseils durant la rédaction de cet article, f-leb et ced pour la relecture orthographique, Chtulus, vermine, chrtophe pour leurs conseils et corrections.