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