Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
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. 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

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('2019-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/2019 (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.

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

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

Exercice 3

Soit polygone un objet GeoJSON de la forme suivante :

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

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