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

Exercices

Introduction

Soit salles la collection construite de la manière suivante :

db.salles.insertMany([ 
   { 
       "_id": 1, 
       "nom": "AJMI Jazz Club", 
       "adresse": { 
           "numero": 4, 
           "voie": "Rue des Escaliers Sainte-Anne", 
           "codePostal": "84000", 
           "ville": "Avignon", 
           "localisation": { 
               "type": "Point", 
               "coordinates": [43.951616, 4.808657] 
           } 
       }, 
       "styles": ["jazz", "soul", "funk", "blues"], 
       "avis": [{ 
               "date": new Date('2024-11-01'), 
               "note": NumberInt(8) 
           }, ...

Suppressions, insertions et mises à jour de documents

Exercice 1

Affichez l’identifiant et le nom des salles qui sont des SMAC.

Exercice 2

Affichez le nom des salles qui possèdent une capacité d’accueil strictement supérieure à 1000 places.

Exercice 3

Affichez l’identifiant des salles pour lesquelles le champ adresse ne comporte pas de numéro.

Exercice 4

Affichez l’identifiant puis le nom des salles qui ont exactement un avis.

Exercice 5

Affichez tous les styles musicaux des salles qui programment notamment du blues.

Exercice 6

Affichez tous les styles musicaux des salles qui ont le style « blues » en première position dans leur tableau styles.

Exercice 7

Affichez la ville des salles dont le code postal commence par 84 et qui ont une capacité strictement inférieure à 500 places (pensez à utiliser une expression régulière).

Exercice 8

Affichez l’identifiant pour les salles dont l’identifiant est pair ou le champ avis est absent.

Exercice 9

Affichez le nom des salles dont au moins un des avis comporte une note comprise entre 8 et 10 (tous deux inclus).

Exercice 10

Affichez le nom des salles dont au moins un des avis comporte une date postérieure au 15/11/2024 (pensez à utiliser le type JavaScript Date).

Exercice 11

Affichez le nom ainsi que la capacité des salles dont le produit de la valeur de l’identifiant...

Validation des documents

Exercice 1

Modifiez la collection salle afin que soient dorénavant validés les documents destinés à y être insérés ; cette validation aura lieu en mode « strict » et portera sur les champs suivants :

  • nom sera obligatoire et devra être de type chaîne de caractères.

  • capacite sera obligatoire et devra être de type entier (int).

  • Dans le champ adresse, les champs codePostal et ville, tous deux de type chaîne de caractères, seront obligatoires.

Que constatez-vous lors de la tentative d’insertion suivante, et quelle en est la cause ?

db.salles.insertOne( 
{"nom": "Super salle", "capacite": 1500, "adresse": {"ville": 
"Musiqueville"}} 
) 

Que proposez-vous pour régulariser la situation ?

Exercice 2

Rajoutez à vos critères de validation existants un critère supplémentaire : le champ _id devra dorénavant être de type entier (int) ou ObjectId.

Que se passe-t-il si vous tentez de mettre à jour l’ensemble des documents existants dans la collection à l’aide de la requête suivante :

db.salles.updateMany({}, {$set: {"verifie": true}}) 

Supprimez les critères rajoutés à l’aide de la méthode...

Les index

Exercice 1

Un bref examen de vos fichiers journaux a révélé que la plupart des requêtes effectuées sur la collection salles cible des capacités ainsi que des départements, comme ceci :

db.salles.find({"capacite": {$gt: 500}, "adresse.codePostal": /^30/}) 
db.salles.find({"adresse.codePostal": /^30/, "capacite": {$lte: 400}}) 

Que proposez-vous comme index qui puisse couvrir ces requêtes ?

Détruisez ensuite l’index créé.

Exercice 2

Nous souhaitons pouvoir chercher dans les adresses des noms de voie, de cette façon :

db.salles.find({$text: {$search: "chemin"}}) 

Quel type d’index préconisez-vous ?

Exercice 3

Vous souhaitez pouvoir exécuter ce genre de requête retournant les documents dans l’ordre croissant d’éloignement par rapport à un point donné, quel type d’index allez-vous devoir créer ?

db.salles.find( 
   { 
       "localisation": { 
           $nearSphere: {  
               "type" : "Point",  
               "coordinates" : [ 43.923005, 5.020077 ] ...

Requêtes géospatiales

Exercice 1

Vous disposez du code JavaScript suivant qui comporte une fonction de conversion d’une distance exprimée en kilomètres vers des radians ainsi que d’un document dont les coordonnées serviront de centre à notre sphère de recherche. Écrivez la requête $geoWithin qui affichera le nom des salles situées dans un rayon de 60 kilomètres et qui programment du Blues et de la Soul.

KilometresEnRadians = function(kilometres){ 
   rayonTerrestreEnKm = 6371 
   return kilometres / rayonTerrestreEnKm 
}; 
 
salle = db.salles.findOne({"adresse.ville": "Nîmes"}) 
 
requete = { ... }; 
 
db.salles.find(requete ... }; 

Exercice 2

Écrivez la requête qui permet d’obtenir la ville des salles situées dans un rayon de 100 kilomètres autour de Marseille, triées de la plus proche à la plus lointaine :

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

Exercice 3

Soit polygone un objet GeoJSON de la forme suivante :

polygone = { 
     "type": "Polygon", 
     "coordinates": [ 
            [ 
 ...

Le framework d’agrégation

Exercice 1

Écrivez le pipeline qui affichera dans un champ nommé ville le nom de celles abritant une salle de plus de 50 personnes ainsi qu’un booléen nommé grande qui sera positionné à la valeur « vrai » lorsque la salle dépasse une capacité de 1 000 personnes. Voici le squelette du code à utiliser dans le shell :

pipeline = [ 
... 
] 
 
db.salles.aggregate(pipeline) 

Exercice 2

Écrivez le pipeline qui affichera dans un champ nommé apres_extension la capacité d’une salle augmentée de 100 places, dans un champ nommé avant_extension sa capacité originelle, ainsi que son nom.

Exercice 3

Écrivez le pipeline qui affichera, par numéro de département, la capacité totale des salles y résidant. Pour obtenir ce numéro, il vous faudra utiliser l’opérateur $substrBytes dont la syntaxe est la suivante :

{$substrBytes: [ < chaîne de caractères >, < indice de départ >, 
< longueur > ]} 

Exercice 4

Écrivez le pipeline qui affichera, pour chaque style musical, le nombre de salles le programmant. Ces styles seront classés par ordre alphabétique.

Exercice 5

À l’aide des buckets, comptez les salles en fonction de leur capacité :

  • celles de 100 à...