Académique Documents
Professionnel Documents
Culture Documents
TP MongoDB
2022-2023
Objectifs du TP
Le TP aborde les points suivants :
1. Familiarisation avec un système NoSQL
2. Familiarisation avec les concepts de réplication et sharding
3. Prise en main de la logique Map/Reduce
4. Mise en place d’un cluster MongoDB
Sommaire
1 MongoDB 2
1.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Import d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Shell Mongo & Map/Reduce . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.1 Shell Mongo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.2 Requêtes Mongo . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.3 Jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Driver Java 4
2.1 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Création d’un client et connexion au serveur . . . . . . . . . . . . . . 4
2.3 Insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Interrogation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.5 Mise-à-jour et suppression . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Driver NodeJS 6
4 Interface RESTHeart 7
Exercices
1 MongoDB
1.1 Installation
• MongoDB est un système libre de droits (pour sa version communautaire),
téléchargeable à l’adresse http://www.mongodb.org/downloads (ou https://www.
mongodb.org/dl/win32/i386 pour les machines 32 bits).
• Pour lancer le serveur il suffit de taper la commande mongod (se placer sous
mongodir/bin si ce chemin n’a pas été ajouté à PATH)
• Si tout se passe bien vous le serveur se met à l’écoute sur le port 27017 et vous
obtenez le message suivant :
[initandlisten] waiting for connections on port 27017
• Dans une autre fenêtre, importer le fichier movies.json avec la commande ci-
après. La commande importe les documents contenus dans le fichier movies.json
dans la collection movies de la base dbtp. Notez que vous n’avez pas besoin de
créer ni la collection ni la base avant d’exécuter la commande. L’argument
jsonArray de la commande indique à l’utilitaire d’import qu’il s’agit d’un
tableau d’objets à créer individuellement, et non d’un unique document JSON.
mongoimport -d dbtp -c movies - -file c:\movies.json - -jsonArray
• La base par défaut s’appelle test. Pour se placer dans la base dbtp tapez use
dbtp.
4. Compter le nombre de films dont le genre est soit ”Thriller” soit ”drama”.
1.3.3 Jointure
Import de données Téléchargez les fichiers artists https://www.dropbox.com/
s/wxr2ek9nn8ru8kp/artists.json?dl=0 et moviesAvecRef https://www.dropbox.
com/s/edasp00vrbailwh/moviesAvecRef.json?dl=0 et insérez les données dans la
base comme suit
mongoimport -d dbtp -c artists --file artists.json --jsonArray
mongoimport -d dbtp -c moviesRef --file moviesAvecRef.json --jsonArray
2 Driver Java
2.1 Configuration
1. Téléchargez la version 3.2.2 ou une version ultérieure du driver Java de Mon-
goDB (https://oss.sonatype.org/content/repositories/releases/org/
mongodb/mongodb-driver/3.2.2/)
2. Téléchargez mongodb-driver-core (https://oss.sonatype.org/content/repositories/
releases/org/mongodb/mongodb-driver-core/3.2.2/)
2.3 Insertion
La création d’un document MongoDB peut se faire soit avec la classe Document
fourni par MongoDB soit avec la bibliothèque Gson de Google. Les 2 méthodes sont
illustrées ci-après. Un objet de type Document dispose d’une méthode append()
permettant d’ajouter un champ au document JSON. Un objet Gson permet de
sérialiser un objet Java en un objet String formaté selon JSON. Les 2 méthodes sont
équivalentes et donnent un même résultat.
// Insertion d’un document : première méthode
Document document = new Document(" id", 200).append("title", "Logan");
collection.insertOne(document);
// Remplacer un document
document.append("director", new Document(" id", "a:1").append("fname","john"));
collection.replaceOne(Filters.eq(" id", document.get(" id")), document);
Il est également possible d’utiliser l’instruction collection.add(Document d)
pour insérer un document d et la commande collection.insertMany(ArrayList<Document>
listDocs) pour l’insertion d’un ensemble de documents.
2.4 Interrogation
Parcours des résultats MongoDB ne dispose pas d’un langage de requêtes stan-
dard (à l’instar de SQL). Cependant il offre plusieurs méthodes pour l’interrogation
d’une collection. La méthode de base pour l’interrogation est find(). La méthode
find() retourne les documents recherchés dans un curseur (semblable au ResultSet
de JDBC). Le parcours du curseur se fait comme suit.
Document myDoc = new Document();
MongoCursor<Document> cursor = collection.find().iterator();
try {
while (cursor.hasNext()) {
myDoc = cursor.next();
System.out.println(myDoc.toJson());
}
}
finally {
cursor.close();
}
Alternativement, il est possible de récupérer le résultat d’un find dans un tableau
Projection Lors que tous les champs ne sont pas utiles, il est possible de faire
l’équivalent d’une projection SQL
3 Driver NodeJS
Lorsque vous utilisez NodeJS comme serveur BackEnd, une pratique largement
répandue consiste à stocker les données dans une base MongoDB. Dans la suite
nous illustrons ceci par un exemple simple (cette partie peut être ignorée si vous
n’êtes pas intéressé par NodeJS et la fameuse MEAN Stack).
db.collection("users").update(
{ id: o. id},
{ $set: { name: "TOTO" }
});
4. Sous le shell node, tapez la commande suivante pour exécuter votre script
node test.js
4 Interface RESTHeart
A l’image de plusieurs systèmes NoSQL comme couchDB et plus récemment SQL
comme Oracle, MongoDB offre une interface REST via RESTHeart. Pour le tester,
téléchargez la version la plus récente à l’url https://github.com/SoftInstigate/
RESTHeart/releases. Cette interface REST pourrait être utile si par exemple vous
voulez accéder à MongoDB directement à partir d’Angular (sans passer par Node)
ou si vous ne voulez pas manipuler le langage propriétaire de MongoDB.
1. Pour lancer RESTHeart tapez la commande ci-après (placez vous avant sur le
répertoire ou vous avez décompressé l’archive)
java -server -jar restheart.jar
2. Utilisez un client cUrl ou postman pour envoyer des requêtes à votre base Mon-
goDB. Par exemple la commande ci-après retourne le document { id:”movie:1”}
de la collection movies de la base dbtp
curl http://localhost:8080/dbtp/movies/movie:1
2. Lançons maintenant les 2 serveurs, chacun sur un port. Ils forment le Replica
Set rs00.
mongod --port 27017 --replSet rs00 --dbpath c:\dbTp\noeud1
mongod --port 27018 --replSet rs00 --dbpath c:\dbTp\noeud2
4. Et initialisons le RS
rs.initiate()
8. Test d’insertion
use dbtp;
db.colTest.insert ({" id": 1, "nom": "foulen"})
5.2 Sharding
1. Lancez un premier shard MongoDB
mongod --port 27018 --dbpath c:\noeud1 4
3. Créez un ConfigServer
mongod --configsvr --port 27020 --dbpath c:\confdb
• Création des répertoires pour les différents serveurs (n1, n2, n3 resp pour les
shards. Configdb pour le répertoire de sharding)
C:\ > cd dbTp
C:\dbTp>mkdir n1
C:\dbTp>mkdir n2
C:\dbTp>mkdir n3
C:\dbTp>mkdir configdb
5
A partir de la version 3.4 il faut ajouter le rôle des serveurs dans le cluster
mongod –shardsvr –port 27018 –replSet rs01 –dbpath c:\dbTp\n1
mongod –shardsvr –port 27019 –replSet rs01 –dbpath c:\dbTp\n2
6
A partir de la version 3.4 il faut ajouter le rôle des serveurs dans le cluster
mongod –shardsvr –port 27018 –dbpath c:\dbTp\n3