Au ciné avec Mongo I 

[1h30]

Soit les données suivantes représentant des films de cinéma.

1
db.Cinema.drop()
2
3
db.Cinema.insert(
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
db.Cinema.insert(
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
db.Cinema.insert(
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
db.Cinema.insert(
41
{
42
nom:"Gran Torino",
43
annee:2008,
44
realisateur:{nom:"Eastwood", prenom:"Clint"},
45
acteurs: 
46
	[ 
47
	{nom:"Vang", prenom:"Bee"}, 
48
	{nom:"Eastwood", prenom:"Clint"}
49
	]
50
})
51
52
db.Cinema.insert(
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
db.Cinema.insert(
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
db.Cinema.insert(
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
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

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.

Question

Quels sont les films sortis en 1990 ?

Indice

db.Cinema.find(document JSON)

Indice

db.col.find({"attribute":"value"})

Solution

db.Cinema.find({"annee":1990})

Question

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

Solution

db.Cinema.find({"annee":{$lt:2000}})

Question

Quels sont les films réalisés par Clint Eastwood ?

Indice

On utilisera un objet comme valeur.

Solution

db.Cinema.find({"realisateur":{"nom":"Eastwood", "prenom":"Clint"}})

Cette solution retourne les document JSON tels qu'ils ont à la racine un objet realisateur qui a exactement la valeur {"nom":"Eastwood", "prenom":"Clint"}.

Question

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.

Solution

db.Cinema.find({"realisateur.prenom":"Clint"})

Question

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"})

Solution

db.Cinema.find({"realisateur.prenom":"Clint", "annee":{$lt:2000}})

Question

Quels sont les films dans lesquels joue Clint Eastwood ?

Solution

db.Cinema.find({"acteurs":{nom:"Eastwood", prenom:"Clint"}})

Question

Quels sont les films dans lesquels joue un Eastwood ?

Solution

db.Cinema.find({"acteurs.nom":"Eastwood"})

Question

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

db.Cinema.find({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.

Solution

db.Cinema.find({"acteurs.nom":"Eastwood"}, {"nom":1,"_id":0})

Question

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 = conn.getDB("...");
3
4
recordset = ...
5
6
while ( recordset.hasNext() ) {
7
   film = recordset.next() ;
8
   print("- ", ...);	
9
}

Solution

1
conn = new Mongo();
2
db = conn.getDB("db1");
3
4
recordset = db.Cinema.find({"acteurs.nom":"Eastwood"}, {"nom":1,"_id":0})
5
6
while ( recordset.hasNext() ) {
7
   film = recordset.next() ;
8
   print("- ", film.nom);	
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

Ajouter trois utilisateurs préférant chacun un ou deux films.

On utilisera les identifiants des films pour les référencer.

Solution

1
db.User.drop()
2
3
db.User.insert(
4
{
5
 "pseudo":"Stph",
6
 "liked" : 
7
   [
8
     {"film":ObjectId("590c366d70f50381c920ca71"),"star":3},
9
     {"film":ObjectId("590c366d70f50381c920ca72"),"star":1}
10
   ]
11
}
12
)
13
14
db.User.insert(
15
{
16
 "pseudo":"Luke",
17
 "liked" : 
18
   [
19
     {"film":ObjectId("590c366d70f50381c920ca71"),"star":2}
20
   ]
21
}
22
)
23
24
db.User.insert(
25
{
26
 "pseudo":"Tuco",
27
 "liked" : 
28
   [
29
     {"film":ObjectId("590c366d70f50381c920ca73"),"star":3}
30
   ]
31
}
32
)
33
34
db.User.find()