Corrigés des exercices
Suppressions, insertions et mises à jour de documents
Exercice 1
db.salles.find({"smac": true}, {"nom": 1})
Exercice 2
db.salles.find({"capacite": {$gt: 1000}}, {"_id": 0, "nom": 1})
Exercice 3
db.salles.find({"adresse.numero": {$exists: false}}, {"_id": 1})
Exercice 4
db.salles.find({"avis": {$size: 1}}, {"_id": 1, "nom": 1})
ou
db.salles.find({"avis": {$size: 1}}, {"nom": 1})
Exercice 5
db.salles.find({"styles": "blues"}, {"_id": 0, "styles": 1})
Exercice 6
db.salles.find({"styles.0": "blues"}, {"_id": 0, "styles": 1})
Exercice 7
db.salles.find({
$and: [{
"adresse.codePostal": /^84/,
"capacite": {$lt: 500}
}]
}, {
"_id": 0,
"adresse.ville": 1
})
ou, plus simplement :
db.salles.find({
"adresse.codePostal": /^84/,
"capacite": {$lt: 500}
}, {
"_id": 0,
"adresse.ville":...
Validation des documents
Exercice 1
Voilà notre commande de création d’une validation sur salles :
db.runCommand( {
collMod: "salles",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "nom", "capacite", "adresse.codePostal",
"adresse.ville"],
properties: {
"nom": {
bsonType: "string",
description: "Chaîne de caractères - requis"
},
"capacite": {
bsonType: "int",
description: "Entier - requis"
},
"adresse.codePostal": {
bsonType: "string",
description: "Chaîne de caractères - requis"
},
"adresse.ville": {
...
Les index
Exercice 1
L’index suivant assurera une couverture de nos requêtes les plus fréquentes :
db.salles.createIndex({ "capacite": 1, "adresse.codePostal": 1 })
Un explain appliqué à nos requêtes montre que le collscan qui était fait avant la mise en place de l’index a disparu au profit de notre index dont le nom par défaut est capacite_1_adresse.codePostal_1.
Cet index pourra également couvrir les tris suivants :
db.salles.find({}).sort({"capacite": 1})
db.salles.find({}).sort({ "capacite": 1, "adresse.codePostal": 1 })
Pour détruire notre index, il suffira d’exécuter :
db.salles.dropIndex("capacite_1_adresse.codePostal_1")
Exercice 2
Le doute n’est pas permis, la solution consiste à créer un index textuel ! Nous prendrons soin de dire que la langue utilisée dans notre collection est le français :
db.salles.createIndex({"adresse.voie": "text"},
{"default_language": "french"})
Exercice 3
Il va nous falloir créer un un index de type 2dsphere pour prendre en charge cette requête géospatiale :
db.salles.createIndex({"localisation": "2dsphere"})
Si nous ne le faisons pas, la requête produira une erreur....
Requêtes géospatiales
Exercice 1
Voici le code complet de notre requête avec les parties manquantes en gras ; souvenez-vous que $geoWithin ne trie en aucune manière les documents qu’il renvoie :
KilometresEnRadians = function(kilometres){
var rayonTerrestreEnKm = 6371;
return kilometres / rayonTerrestreEnKm;
}
salle = db.salles.findOne({"adresse.ville": "Nîmes"});
requete = {
"adresse.localisation" : {
$geoWithin : {
$centerSphere : [
salle.adresse.localisation.coordinates,
KilometresEnRadians(60)
]
}
},
"styles": {$in: ["blues", "soul"]}
}
db.salles.find(requete, {"_id": 0, "nom": 1})
Exercice 2
La notion de tri doit vous mettre sur la piste de $nearSphere !
marseille = {"type": "Point", "coordinates": [43.300000,
5.400000]}
db.salles.find({
"adresse.localisation":...
Le framework d’agrégation
Exercice 1
pipeline = [{
$match: {"capacite": {$gt: 50}},
}, {
$project: {
"_id": 0,
"ville": "$adresse.ville",
"grande": {$gte: ["$capacite", 1000 ]}
}
}
]
db.salles.aggregate(pipeline)
Exercice 2
Notre champ apres_extension fera usage de l’opérateur $addFields ; dans cette partie, nous décrirons l’addition que nous souhaitons, en utilisant $add :
pipeline = [{
$match: {"adresse.codePostal": /^84/},
}, {
$addFields: {
"apres_extension": { $add: [ "$capacite", 100] }
}
}, {
$project: {
"_id": 0,
"nom": 1,
"avant_extension":...