Imbrication avec Json et Mongo
(base de données orientée
document)
Paternité - Partage des Conditions Initiales à l'Identique : [Link]
Table des matières
I - Cours 3
1. Exemple de base de données orientée document avec MongoDB..........................3
1.1. Présentation de MongoDB ................................................................................................................3
1.2. Installation et démarrage de MongoDB ............................................................................................4
1.3. Créer des bases de données et des collections ................................................................................4
1.4. Insertion des documents ..................................................................................................................5
1.5. Trouver des documents ....................................................................................................................6
2. Interroger Mongo en JavaScript ................................................................................6
2.1. Interroger Mongo en JavaScript .......................................................................................................6
II - Exercice 7
1. Exercice : Au ciné avec Mongo I ................................................................................7
2. Exercice : Au ciné avec Mongo II ..............................................................................11
Contenus annexes 13
Glossaire 15
Index 16
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
2
étudiants de l'UTC, 2013-2016)
Cours I
1. Exemple de base de données orientée document avec MongoDB
1.1. Présentation de MongoDB
MongoBD est une base de données open source NoSQL orientée document. Elle stocke des données au
format JSON (en fait BSON, qui est une version binaire de JSON).
Le serveur MongoDB est organisé en plusieurs databases :
Chaque database contient des collections.
Chaque collection contient des documents.
Chaque document est au format JSON et contient donc des propriétés.
Comparaison SQL / MongoDB
SQL MongoDB
base de données et/ou schéma base de données
table collection
enregistrement document
attribut (atomique) propriété (chaîne, entier, tableau, structure)
Schema-less
C'est une base schema-less, aussi une collection peut contenir des documents de structures différentes
et il n'est pas possible de définir la structure a priori d'une collection. La structure d'une collection n'est
donc définie que par les document qui la compose, et elle peut évoluer dynamiquement au fur et à
mesure des insertions et suppressions.
Identification clé / valeur
Chaque document est identifié par un identifiant nommé _id unique pour une collection, fonctionnant
comme une clé primaire artificielle.
Architecture
MongoDB fonctionne a minima sous la forme d'un serveur auquel il est possible de se connecter avec
un client textuel (mongo shell).
MongoDB peut être distribuée sur plusieurs serveurs (partitionnement horizontal ou sharding) et
accédée à travers de multiples couches applicatives (langages, API...)
Complément
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
3
étudiants de l'UTC, 2013-2016)
Cours
1.2. Installation et démarrage de MongoDB
MongoDB est disponible sur Windows, Mac OS X et Linux : [Link]
ion
L'installation présentée ici est uniquement destinée à un contexte d'apprentissage, elle permet
l'installation d'un serveur sur une machine Linux (ou Mac OS X) sans privilèges utilisateurs et
l'exploitation de ce serveur avec un client textuel CLI∗ situé sur la même machine.
Installation du serveur et du client
Installer MongoDB Community Edition sur son système.
Exemple sous Debian : apt-get install mongodb-org après avoir déclaré le dépôt MongoDB.
[Link]
Démarrage d'un serveur Mongo
Créer un espace de stockage en lecture écriture pour la base de données (exemple : mkdir
~/mongodata)
Lancer le serveur MongoDB sur le port standard 27017 : mongod --dbpath ~/mongodata
Démarrage du client CLI Mongo (mongo shell)
Pour se connecter à un serveur MongoDB sur le port standard : mongo --host nom-du-
serveur (par exemple : mongo --host localhost)
Test
Une fois connecté exécuter le code suivant pour vérifier le bon fonctionnement de la base :
1 [Link]({ "test":"Hello World !" })
2 [Link]({}, {_id:0})
Le résultat attendu est le suivant, la clé générée étant bien entendu différente :
{ "test" : "Hello World !" }
Complément
[Link]
1.3. Créer des bases de données et des collections
Créer une base et une collection Fondamental
MongoDB est une base schema-less, la création des bases et des collections est dynamique lors d'une
première insertion de données.
Méthode
Pour créer une base de données il faut exécuter une instruction use sur une nouvelle base de données,
puis donner un ordre d'insertion d'un premier document JSON avec insert.
Exemple
use db1
[Link]( { "x":1 } )
1
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
4
étudiants de l'UTC, 2013-2016)
Cours
Catalogue de données Syntaxe
On peut voir la liste des bases de données avec :
show dbs
On peut voir la liste des collections de la base de données en cours avec :
show collections
On peut voir le contenu d'une collection avec :
[Link]()
Complément
[Link]
1.4. Insertion des documents
L'insertion de données dans une base MongoDB se fait avec l'instruction
[Link](Document JSON).
Si la collection n'existe pas, elle est créée dynamiquement.
L'insertion associe un identifiant (_id) à chaque document de la collection.
Exemple
1 [Link](
2{
3 "nom":"Honkytonk Man",
4 "realisateur":{
5 "nom":"Eastwood",
6 "prenom":"Clint"
7 },
8 "annee":1982,
9 "acteurs":[
10 {
11 "nom":"Eastwood",
12 "prenom":"Kyle"
13 },
14 {
15 "nom":"Eastwood",
16 "prenom":"Clint"
17 }
18 ]
19 }
20 )
Complément
[Link]
[Link]
1
[Link]
2
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
5
étudiants de l'UTC, 2013-2016)
Cours
1.5. Trouver des documents
La recherche de données dans une base MongoDB se fait avec l'instruction
[Link](Document JSON, document JSON), avec :
le premier document JSON définit une restriction ;
le second document JSON définit une projection (ce second argument est optionnel).
Restriction Exemple
1 [Link]({"nom":"Honkytonk Man"})
retourne les document JSON tels qu'ils ont à la racine un attribut "nom" avec la valeur "Honkytonk
Man".
Restriction et projection Exemple
1 [Link]({"nom":"Honkytonk Man"}, {"nom":1, "realisateur":1} )
retourne les document JSON tels qu'ils ont à la racine un attribut "nom" avec la valeur "Honkytonk
Man", et seul les attributs situés à la racine "nom" et "realisateur" sont projetés (en plus de l'attribut
"_id" qui est projeté par défaut).
Complément
[Link]
[Link]
2. Interroger Mongo en JavaScript
2.1. Interroger Mongo en JavaScript
Le console mongo permet dʼexécuter des programme JavaScript avec instruction load.
1 //[Link]
2 print("Hello world");
1 > load("[Link]")
Parcours d'un résultat de requête Mongo
1 //[Link]
2 conn = new Mongo();
3 db = [Link]("db1");
4
5 recordset = [Link]({"liked":{$elemMatch:{"star":3}}}, {"_id":0,
"[Link]":1})
6
7 while ( [Link]() ) {
8 printjson( [Link]() );
9}
Complément
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
6
étudiants de l'UTC, 2013-2016)
Exercice II
1. Exercice : Au ciné avec Mongo I
[1h30]
Soit les données suivantes représentant des films de cinéma.
1 [Link]()
2
3 [Link](
4{
5 nom:"Goodfellas",
6 annee:1990,
7 realisateur:{nom:"Scorsese", prenom:"Martin"},
8 acteurs:
9 [
10 {nom:"De Niro", prenom:"Robert"},
11 {nom:"Liotta", prenom:"Ray"},
12 {nom:"Pesci", prenom:"Joe"}
13 ]
14 })
15
16 [Link](
17 {
18 nom:"The Godfather",
19 annee:1972,
20 realisateur:{nom:"Coppola", prenom:"Francis Ford"},
21 acteurs:
22 [
23 {nom:"Pacino", prenom:"Al"},
24 {nom:"Brando", prenom:"Marlon"},
25 {nom:"Duvall", prenom:"Robert"}
26 ]
27 })
28
29 [Link](
30 {
31 nom:"Million Dollar Baby",
32 realisateur:{nom:"Eastwood", prenom:"Clint"},
33 acteurs:
34 [
35 {nom:"Swank", prenom:"Hilary"},
36 {nom:"Eastwood", prenom:"Clint"}
37 ]
38 })
39
40 [Link](
41 {
42 nom:"Gran Torino",
43 annee:2008,
44 realisateur:{nom:"Eastwood", prenom:"Clint"},
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
7
étudiants de l'UTC, 2013-2016)
Exercice
45 acteurs:
46 [
47 {nom:"Vang", prenom:"Bee"},
48 {nom:"Eastwood", prenom:"Clint"}
49 ]
50 })
51
52 [Link](
53 {
54 nom:"Unforgiven",
55 realisateur:{nom:"Eastwood", prenom:"Clint"},
56 acteurs:
57 [
58 {nom:"Hackman", prenom:"Gene"},
59 {nom:"Eastwood", prenom:"Clint"}
60 ]
61 })
62
63 [Link](
64 {
65 nom:"Mystic River",
66 realisateur:{nom:"Eastwood", prenom:"Clint"},
67 acteurs:
68 [
69 {nom:"Penn", prenom:"Sean"},
70 {nom:"Bacon", prenom:"Kevin"}
71 ]
72 })
73
74 [Link](
75 {
76 nom:"Honkytonk Man",
77 realisateur:{nom:"Eastwood", prenom:"Clint"},
78 annee:1982,
79 acteurs:
80 [
81 {nom:"Eastwood", prenom:"Kyle"},
82 {nom:"Bloom", prenom:"Verna"}
83 ]
84 })
85
86 [Link]()
L'objectif est d'initialiser une base MongoDB avec ce script, puis d'écrire les requêtes MongoDB
permettant de répondre aux questions suivantes.
Question 1
Créer une nouvelle base MongoDB et exécuter le script. Nommez votre base par votre nom de famille ou
votre login sur la machine par exemple.
Indice :
Pour créer une base de données, utiliser l'instruction use myNewDatabase, puis exécuter au moins
une instruction d'insertion.
Indice :
Créer des bases de données et des collections (cf. p.4)
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
8
étudiants de l'UTC, 2013-2016)
Exercice
Question 2
Quels sont les films sortis en 1990 ?
Indice :
Trouver des documents (cf. p.6)
Indice :
[Link](document JSON)
Indice :
La syntaxe JSON (cf. p.13)
Indice :
[Link]({"attribute":"value"})
Question 3
Quels sont les films sortis avant 2000 ?
Indice :
[Link]
Indice :
On utilisera l'objet {$lt:value} à la place de la valeur de l'attribut à tester ($lt pour lesser than).
Question 4
Quels sont les films réalisés par Clint Eastwood ?
Indice :
On utilisera un objet comme valeur.
Question 5
Quels sont les films réalisés par quelqu'un prénommé Clint ?
Indice :
Utiliser le navigateur de propriété des objets point : [Link].
Question 6
Quels sont les films réalisés par quelqu'un prénommé Clint avant 2000 ?
Indice :
Utiliser une liste de conditions attribut:valeur pour spécifier un AND (et logique) :
[Link]({"attribute1":"value1", "attribute2":"value2"})
Question 7
Quels sont les films dans lesquels joue Clint Eastwood ?
Indice :
[Link]
Question 8
Quels sont les films dans lesquels joue un Eastwood ?
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
9
étudiants de l'UTC, 2013-2016)
Exercice
Question 9
Quels sont les noms des films dans lesquels joue un Eastwood ?
Indice :
Pour gérer la projection, utiliser un second argument de la clause find() :
[Link]({document JSON de sélection }, {document JSON de
projection})
avec document JSON de projection de la forme : {"attribut1":1, "attribut2":1...}
Indice :
Les identifiants sont toujours affichés par défaut, si on veut les supprimer, on peut ajouter la clause
_id:0 dans le document de projection.
Question 10
Compléter le programme JavaScript suivant afin d'afficher les titre selon le format suivant :
1- Million Dollar Baby
2- Gran Torino
3- Unforgiven
4- Honkytonk Man
Indice :
1 conn = new Mongo();
2 db = [Link]("...");
3
4 recordset = ...
5
6 while ( [Link]() ) {
7 film = [Link]() ;
8 print("- ", ...);
9}
On veut à présent ajouter une nouvelle collection permettant de gérer des utilisateurs et leurs
préférences. Pour chaque utilisateur on gérera un pseudonyme, et une liste de films préférés avec une
note allant de une à trois étoiles.
Question 11
Ajouter trois utilisateurs préférant chacun un ou deux films.
On utilisera les identifiants des films pour les référencer.
Indice :
Insertion des documents (cf. p.5)
Indice :
[Link]
1
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
10
étudiants de l'UTC, 2013-2016)
Exercice
2. Exercice : Au ciné avec Mongo II
[30 min]
Soit les données suivantes représentant des films de cinéma et des avis d'utilisateurs concernant ces
films.
1 [Link]()
2
3 [Link](
4{
5 nom:"Goodfellas",
6 annee:1990,
7 realisateur:{nom:"Scorsese", prenom:"Martin"},
8 })
9
10 [Link](
11 {
12 nom:"The Godfather",
13 annee:1972,
14 realisateur:{nom:"Coppola", prenom:"Francis Ford"},
15 })
16
17 [Link](
18 {
19 nom:"Million Dollar Baby",
20 realisateur:{nom:"Eastwood", prenom:"Clint"},
21 })
22
23 [Link](
24 {
25 nom:"Gran Torino",
26 annee:2008,
27 realisateur:{nom:"Eastwood", prenom:"Clint"},
28 })
29
30 [Link]()
1 [Link]()
2
3 [Link](
4{
5 "pseudo":"Stph",
6 "liked" :
7 [
8 {"film":ObjectId("590c366d70f50381c920ca71"),"star":3},
9 {"film":ObjectId("590c366d70f50381c920ca72"),"star":1}
10 ]
11 }
12 )
13
14 [Link](
15 {
16 "pseudo":"Luke",
17 "liked" :
18 [
19 {"film":ObjectId("590c366d70f50381c920ca71"),"star":2}
20 ]
21 }
22 )
23
24 [Link](
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
11
étudiants de l'UTC, 2013-2016)
Exercice
25 {
26 "pseudo":"Tuco",
27 "liked" :
28 [
29 {"film":ObjectId("590c366d70f50381c920ca73"),"star":3}
30 ]
31 }
32 )
33
34 [Link]()
Question 1
Critiquer cette insertion mobilisant les identifiants des films ? Pourquoi n'est ce pas reproductible ?
Imaginez deux solutions.
Question 2
Pourquoi trouver les titres de ces films n'est pas trivial avec Mongo (si, comme dans l'énoncé initial on a
pas stocké le nom du film comme clé de référencement dans la collection User) ?
Question 3
On cherche à présent les identifiants des films qui sont aimés au moins une fois avec 3 étoiles.
On essaie cette requête : [Link]({"[Link]":3}, {_id:0,
"[Link]":1}), mais elle ne renvoie pas le résultat escompté.
Expliquez pourquoi ? Proposez des solutions.
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
12
étudiants de l'UTC, 2013-2016)
Contenus annexes
1. La syntaxe JSON en bref
Règles syntaxiques Syntaxe
Il ne doit exister qu'un seul élément père par document contenant tous les autres : un élément
racine.
Tout fichier JSON bien formé doit être :
soit un objet commençant par { et se terminant par },
soit un tableau commençant par [ et terminant par ].
Cependant ils peuvent être vides, ainsi [] et {} sont des JSON valides.
Les séparateurs utilisés entre deux paires/valeurs sont des virgules.
Un objet JSON peut contenir d'autres objets JSON.
Il ne peut pas y avoir d'éléments croisés.
Éléments du format JSON Fondamental
Il existe deux types d'éléments :
Des couples de type "nom": valeur, comme l'on peut en trouver dans les tableaux associatifs.
Des listes de valeurs, comme les tableaux utilisés en programmation.
Valeurs possibles Définition
Primitifs : nombre, booléen, chaîne de caractères, null.
Tableaux : liste de valeurs (tableaux et objets aussi autorisés) entrées entre crochets, séparées
par des virgules.
Objets : listes de couples "nom": valeur (tableaux et objets aussi autorisés) entrés entre
accolades, séparés par des virgules.
Exemple
1{
2 "nom cours" : "NF29",
3 "theme" : "ingenierie documentaire",
4 "etudiants" : [
5 {
6 "nom" : "Norris",
7 "prenom" : "Chuck",
8 "age" : 73,
9 "pays" : "USA"
10 },
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
13
étudiants de l'UTC, 2013-2016)
Contenus annexes
11 {
12 "nom" : "Doe",
13 "prenom" : "Jane",
14 "age" : 45,
15 "pays" : "Angleterre"
16 },
17 {
18 "nom" : "Ourson",
19 "prenom" : "Winnie",
20 "age" : 10,
21 "pays" : "France"
22 }
23 ]
24 }
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
14
étudiants de l'UTC, 2013-2016)
Glossaire
CLI (Interface en ligne de commande)
Une interface en ligne de commande (en anglais command line interface) est une interface homme-
machine dans laquelle la communication entre l'utilisateur et l'ordinateur s'effectue en mode
texte.
[Link]
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
15
étudiants de l'UTC, 2013-2016)
Index
JSON ..........................................13
Stéphane Crozat (Contributions : U. Meyer, A. Sonko, H. Carrel-Billiard, M. Uzan, C. Fecherolle, les
16
étudiants de l'UTC, 2013-2016)