Le principe du pipeline
aggregate() reçoit un tableau d'étapes. Chaque étape reçoit les documents de la précédente, les transforme, et passe le résultat à la suivante — comme un tapis roulant.
db.collection.aggregate([
{ $etape1: { ... } },
{ $etape2: { ... } },
...
])
$match) pour réduire le volume, avant les étapes coûteuses.$match — filtrer
$match sélectionne les documents (même syntaxe que le filtre de find). Placé en premier, il allège tout le pipeline.
db.campagnes.aggregate([
{ $match: { statut: "OUVERTE" } }
])
$group — regrouper & calculer
$group regroupe les documents par une clé (_id) et calcule des accumulateurs : $sum, $avg, $min, $max, $count, $push…
db.clients.aggregate([
{ $group: {
_id: "$ville", // clé de regroupement
totalPoints: { $sum: "$points" },
moyenne: { $avg: "$points" },
nb: { $sum: 1 }
}}
])
Résultat
"$points" désigne la valeur du champ points de chaque document. _id: null regroupe tous les documents en un seul total.$unwind — déplier un tableau
$unwind « éclate » un tableau : il produit un document par élément. Indispensable pour agréger sur les éléments d'un tableau embarqué (comme nos commandes).
db.campagnes.aggregate([
{ $unwind: "$commandes" }, // 1 ligne par commande
{ $group: {
_id: "$zone",
volumeTotal: { $sum: "$commandes.litres" }
}}
])
$lookup — la jointure
$lookup joint une autre collection (l'équivalent d'un JOIN SQL) — par exemple pour rattacher à chaque campagne les infos de son fournisseur référencé.
db.campagnes.aggregate([
{ $lookup: {
from: "fournisseurs",
localField: "fournisseurId",
foreignField: "_id",
as: "fournisseur" // tableau de résultats
}}
])
$lookup ajoute un tableau as ; on le déplie souvent avec $unwind juste après, puisqu'on n'attend qu'un fournisseur.$project, $sort, $limit, $bucket
- $project — choisir/renommer/calculer des champs de sortie.
- $sort, $limit, $skip — comme sur le curseur, mais dans le pipeline.
- $bucket / $bucketAuto — répartir en tranches (histogramme).
{ $project: { _id: 0, zone: "$_id", volumeTotal: 1 } }
{ $sort: { volumeTotal: -1 } }
{ $limit: 5 }
C'est le chapitre qui fait vivre le projet : $unwind sur commandes + $group avec $sum = le volume total par campagne ; $lookup sur fournisseurs = récupérer les paliers pour en déduire le prix. Le chapitre 15 déroule ces pipelines pas à pas.
- Agrégation = pipeline d'étapes qui se passent les documents.
$match(filtrer tôt),$group(+$sum/$avg),$unwind(déplier un tableau).$lookup= jointure ;$project,$sort,$limit,$bucket.