🛢️Parcours Fioul GroupéMongoDB · Chapitre 14
Accueil › MongoDB › Chapitre 14
Chapitre 14 / 17

Les agrégations

L'agrégation est l'outil le plus puissant de MongoDB : un pipeline d'étapes qui transforment les documents (filtrer, regrouper, calculer, joindre). C'est l'équivalent — en plus expressif — du GROUP BY et des jointures du SQL.

1 Notion

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: { ... } },
  ...
])
À retenir — l'ordre des étapes compte. On filtre tôt ($match) pour réduire le volume, avant les étapes coûteuses.
2 Étape

$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" } }
])
3 Étape

$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

{ _id: "Limoges", totalPoints: 260, moyenne: 86.6, nb: 3 } { _id: "Brive", totalPoints: 200, moyenne: 200, nb: 1 }
Le champ précédé de $ — "$points" désigne la valeur du champ points de chaque document. _id: null regroupe tous les documents en un seul total.
4 Étape

$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" }
  }}
])
5 Étape

$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
  }}
])
À retenir — $lookup ajoute un tableau as ; on le déplie souvent avec $unwind juste après, puisqu'on n'attend qu'un fournisseur.
6 Étape

$project, $sort, $limit, $bucket

{ $project: { _id: 0, zone: "$_id", volumeTotal: 1 } }
{ $sort: { volumeTotal: -1 } }
{ $limit: 5 }
🛢️ Sur le projet Fioul Groupé

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.

Ce qu'il faut retenir du chapitre
  • 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.
← Chapitre 13