Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. MongoDB
  3. Corrigés des exercices
Extrait - MongoDB Comprendre et optimiser l'exploitation de vos données (avec exercices et corrigés) (2e édition)
Extraits du livre
MongoDB Comprendre et optimiser l'exploitation de vos données (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

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":...