Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  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)
Extraits du livre
MongoDB Comprendre et optimiser l'exploitation de vos données (avec exercices et corrigés) 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": { 
           bsonType: "string", 
           description: "Chaîne de caractères - requis" 
        }, 
     } 
  } } 
}) 

Une autre version, nous permettant de signifier que codePostal et ville doivent impérativement exister, mais cette fois-ci au sein du champ adresse et plus du document racine, serait la suivante :

db.runCommand( { 
  collMod: "salles", 
  validator: { $jsonSchema: { 
     bsonType: "object", 
     required: [ "nom", "capacite"], 
     properties: { 
        "nom": { 
           bsonType: "string", 
           description: "Chaîne de caractères - requis" 
     ...

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 :

var KilometresEnRadians = function(kilometres){ 
   var rayonTerrestreEnKm = 6371; 
   return kilometres / rayonTerrestreEnKm; 
}; 
 
var salle = db.salles.findOne({"adresse.ville": "Nîmes"}); 
 
var 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 !

var marseille = {"type": "Point", "coordinates": [43.300000, 5.400000]} 
 
db.salles.find({  
   "adresse.localisation":...

Le framework d’agrégation

Exercice 1

var 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 :

var pipeline = [{ 
       $match: {"adresse.codePostal": /^84/}, 
   }, { 
       $addFields: { 
           "apres_extension": { $add: [ "$capacite",  100] } 
       } 
   }, { 
       $project: { 
           "_id": 0,  
           "nom": 1,  
           "avant_extension":...