TP 2 : Agrégation avec MongoDB
Objectifs
Après avoir terminé ce TP, vous serez capable de :
• Décrire des opérateurs d'agrégation simples qui traitent et calculent des données telles que $sort,
$limit, $group, $sum, $min, $max et $avg
• Combinez des opérateurs pour créer des pipelines d'agrégation multi-étapes
Exercice 1 - Préparation de l'environnement
1. Chargez les données d'exemple dans la base de données de ‘training’
use training
[Link]({"name":"Ramesh","subject":"maths","marks":87})
[Link]({"name":"Ramesh","subject":"english","marks":59})
[Link]({"name":"Ramesh","subject":"science","marks":77})
[Link]({"name":"Rav","subject":"maths","marks":62})
[Link]({"name":"Rav","subject":"english","marks":83})
[Link]({"name":"Rav","subject":"science","marks":71})
[Link]({"name":"Alison","subject":"maths","marks":84})
[Link]({"name":"Alison","subject":"english","marks":82})
[Link]({"name":"Alison","subject":"science","marks":86})
[Link]({"name":"Steve","subject":"maths","marks":81})
[Link]({"name":"Steve","subject":"english","marks":89})
[Link]({"name":"Steve","subject":"science","marks":77})
[Link]({"name":"Jan","subject":"english","marks":0,"reason":"absent"})
Exercice 2 - Limiter les lignes dans la sortie
En utilisant l'opérateur $limit, nous pouvons limiter le nombre de documents imprimés dans la
sortie.
Cette commande imprimera uniquement 2 documents de la collection marks.
use training
[Link]([{"$limit":2}])
Exercice 3 - Tri basé sur une colonne
Nous pouvons utiliser l'opérateur $sort pour trier la sortie. Cette commande trie les documents en
fonction du champ marks par ordre croissant.
[Link]([{"$sort":{"marks":1}}])
Cette commande trie les documents en fonction du champ marks par ordre décroissant.
[Link]([{"$sort":{"marks":-1}}])
Exercice 4 - Trier et limiter
L'agrégation implique généralement l'utilisation de plus d'un opérateur. Un pipeline consiste en un
ou plusieurs opérateurs déclarés à l'intérieur d'un tableau.
Les opérateurs sont séparés par des virgules. MongoDB exécute le premier opérateur dans le
pipeline et envoie sa sortie à l'opérateur suivant. Créons un pipeline à deux étages qui répond à la
question "Quels sont les 2 meilleurs résultats ?".
[Link]([
{"$sort":{"marks":-1}},
{"$limit":2}
])
Exercice 5 - Regroupement par
L'opérateur $group by, avec des opérateurs comme $sum, $avg, $min, $max, nous permet
d'effectuer des opérations de regroupement.
Ce pipeline d'agrégation imprime la moyenne des notes pour toutes les matières.
[Link]([
"$group":{
"_id":"$subject",
"average":{"$avg":"$marks"}
])
La requête ci-dessus est équivalente à la requête SQL suivante.
SELECT subject, average(marks)
FROM marks
GROUP BY subject
Exercice 6 - Mettre tous ensemble
Maintenant, mettons ensemble tous les opérateurs que nous avons appris pour répondre à la
question.
"Qui sont les 2 meilleurs étudiants en fonction de la moyenne des notes ?" Cela implique :
trouver la moyenne des notes par étudiant.
trier la sortie en fonction des notes moyennes par ordre décroissant.
limiter la sortie à deux documents.
[Link]([
"$group":{
"_id":"$name",
"average":{"$avg":"$marks"}
},
"$sort":{"average":-1}
},
"$limit":2
])
Exercices pratiques
1. Trouver le total des notes pour chaque étudiant dans toutes les matières. Sur le client mongo,
exécutez les commandes suivantes.
[Link]([
"$group":{"_id":"$name","total":{"$sum":"$marks"}}
])
2. Trouver les notes maximales obtenues dans chaque matière. Sur le client mongo, exécutez les
commandes suivantes.
[Link]([
"$group":{"_id":"$subject","max_marks":{"$max":"$marks"}}
])
3. Trouver les notes minimales obtenues par chaque étudiant. Sur le client mongo, exécutez les
commandes suivantes.
[Link]([
"$group":{"_id":"$name","min_marks":{"$min":"$marks"}}
])
4. Trouver les deux meilleures matières en fonction des notes moyennes. Sur le client mongo,
exécutez les commandes suivantes.
[Link]([
"$group":{
"_id":"$subject",
"average":{"$avg":"$marks"}
}
},
"$sort":{"average":-1}
},
"$limit":2
])