tp1 Mongodb
tp1 Mongodb
tp1 Mongodb
I. Partie 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.
SQL MongoDB
table collection
enregistrement document
1
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
https://docs.mongodb.org/manual
db.test.insert({ "a":0 })
db.test.find()
Le résultat attendu est le suivant, la clé générée étant bien entendu différente :
{ "_id":ObjectId("574ebe32b3286a9a8fadfb55"), "a":0 }
Complément
https://docs.mongodb.com/manual/mongo/
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.
https://docs.mongodb.org/manual
https://docs.mongodb.com/manual/installation/
https://docs.mongodb.com/manual/mongo
Exemple
use db1
db.col1.insert( { "x":1 } )
Exemple
3
db.Cinema.insert(
{
"nom":"Honkytonk Man",
"realisateur":{
"nom":"Eastwood",
"prenom":"Clint"
},
"annee":1982,
"acteurs":[
{
"nom":"Eastwood",
"prenom":"Kyle"
},
{
"nom":"Eastwood",
"prenom":"Clint"
}
]
}
)
Complément
https://docs.mongodb.org/manual/core/crud
https://docs.mongodb.com/manual/tutorial/insert-documents
Trouver des documents
La recherche de données dans une base MongoDB se fait avec l'instruction
db.collection.find(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).
https://docs.mongodb.org/manual/core/crud/
https://docs.mongodb.com/manual/tutorial/insert-documents/
Exemple : Restriction
db.Cinema.find({"nom":"Honkytonk Man"})
retourne les document JSON tels qu'ils ont à la racine un attribut "nom" avec la valeur
"Honkytonk Man".
Complément
https://docs.mongodb.org/manual/tutorial/query-documents/12
1 //test.js
2 print("Hello world");
> load("test.js")
Parcours d'un résultat de requête Mongo
5
//query.js conn =
new Mongo(); db =
conn.getDB("db1");
while ( recordset.hasNext() ) {
printjson( recordset.next() );
}
Complément
https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/
II. Partie 2 :
Soit les données suivantes représentant des films de cinéma.
db.Cinema.drop()
db.Cinema.insert(
{
nom:"Goodfellas",
annee:1990,
realisateur:{nom:"Scorsese", prenom:"Martin"}, acteurs:
[
{nom:"De Niro", prenom:"Robert"},
{nom:"Liotta", prenom:"Ray"},
{nom:"Pesci", prenom:"Joe"}
] })
db.Cinema.insert(
{
nom:"The Godfather",
annee:1972,
realisateur:{nom:"Coppola", prenom:"Francis Ford"}, acteurs:
[
{nom:"Pacino", prenom:"Al"},
{nom:"Brando", prenom:"Marlon"},
{nom:"Duvall", prenom:"Robert"}
] })
db.Cinema.insert(
{
nom:"Million Dollar Baby",
realisateur:{nom:"Eastwood", prenom:"Clint"}, acteurs:
[
{nom:"Swank", prenom:"Hilary"},
{nom:"Eastwood", prenom:"Clint"}
] })
db.Cinema.insert(
7
{
nom:"Gran Torino",
annee:2008,
realisateur:{nom:"Eastwood", prenom:"Clint"}, acteurs:
[
{nom:"Vang", prenom:"Bee"},
{nom:"Eastwood", prenom:"Clint"}
] })
db.Cinema.insert(
{
nom:"Unforgiven",
realisateur:{nom:"Eastwood", prenom:"Clint"}, acteurs:
[
{nom:"Hackman", prenom:"Gene"},
{nom:"Eastwood", prenom:"Clint"}
] })
db.Cinema.insert(
{
nom:"Mystic River",
realisateur:{nom:"Eastwood", prenom:"Clint"}, acteurs:
[{nom:"Penn", prenom:"Sean"},
{nom:"Bacon", prenom:"Kevin"}
] })
db.Cinema.insert(
{
nom:"Honkytonk Man",
realisateur:{nom:"Eastwood", prenom:"Clint"},
annee:1982,
acteurs:
[
{nom:"Eastwood", prenom:"Kyle"},
{nom:"Bloom", prenom:"Verna"}
] })
db.Cinema.find()
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.
Indices : Pour créer une base de données, utiliser l'instruction use myNewDatabase, puis
exécuter au moins une instruction d'insertion. Créer des bases de données et des
collections
Question 2
Question 3
Quels sont les films sortis avant 2000 ?
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 : object.attribute.
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) :
db.col.find({"attribute1":"value1", "attribute2":"value2"})
Question 7
Quels sont les films dans lesquels joue Clint Eastwood ?
9
Question 8
Quels sont les films dans lesquels joue un Eastwood ?
Indice : Utiliser le parser de tableau $elemMatch:{"key":"value"} à la place de la valeur.
Question 9
Quels sont les noms des films dans lesquels joue un Eastwood ?
Indices
Pour gérer la projection, utiliser un second argument de la clause find() :
db.Cinema.find({document JSON de sélection }, {document JSON de projection}) avec
document JSON de projection de la forme : {"attribut1":1,"attribut2":1...}
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 :
conn = new
Mongo(); db =
conn.getDB("...");
recordset = ...
while ( recordset.hasNext() ) {
film = recordset.next() ;
print("- ", ...);
}
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 d’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.
Question 12
Critiquer cette insertion mobilisant les identifiants des films ? Pourquoi n'est ce pas
reproductible ?
Question 13
Quels sont les utilisateurs qui aiment au moins un film avec 3 étoiles ?
Question 14
Quels sont les identifiants des films qui sont aimés au moins une fois avec 3 étoiles ?
Question 15
Pourquoi trouver les titres de ces films n'est pas simple avec Mongo ?
Question 16
Écrire le programme JavaScript permettant de récupérer la liste dédoublonnée des
identifiants de films qui sont aimés au moins une fois avec 3 étoiles, puis d'afficher les titres
des films correspondants.
Indice :
conn = new
Mongo(); db =
conn.getDB("...");
films = ...
11