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

Exemples d'agrégations

On met en pratique le pipeline du chapitre 14 sur des cas concrets du projet Fioul Groupé, construits étape par étape. Objectif : savoir composer les étapes pour répondre à une vraie question.

1 Cas

Le volume total par campagne

On déplie les commandes puis on somme les litres, campagne par campagne.

db.campagnes.aggregate([
  { $unwind: "$commandes" },
  { $group: {
      _id: "$zone",
      volumeTotal: { $sum: "$commandes.litres" },
      participants: { $sum: 1 }
  }},
  { $sort: { volumeTotal: -1 } }
])

Résultat

{ _id: "Ladignac-le-Long", volumeTotal: 4200, participants: 3 } { _id: "Saint-Yrieix", volumeTotal: 2600, participants: 2 }
2 Cas

En déduire le palier de prix

Une fois le volume connu, on choisit le bon palier du fournisseur. On joint le fournisseur ($lookup), puis on calcule (ici, une logique simplifiée avec $switch).

db.campagnes.aggregate([
  { $unwind: "$commandes" },
  { $group: { _id: "$_id", zone: { $first: "$zone" },
             volume: { $sum: "$commandes.litres" } } },
  { $addFields: {
      prixLitre: { $switch: { branches: [
        { case: { $gte: ["$volume", 8000] }, then: 0.98 },
        { case: { $gte: ["$volume", 3000] }, then: 1.02 }
      ], default: 1.08 } }
  }}
])
À retenir — $addFields ajoute un champ calculé sans supprimer les autres. $switch est un « si/sinon » dans le pipeline.
3 Cas

Le top 3 des zones les plus mobilisées

On réutilise le volume par zone, on trie, on limite.

db.campagnes.aggregate([
  { $unwind: "$commandes" },
  { $group: { _id: "$zone", volume: { $sum: "$commandes.litres" } } },
  { $sort: { volume: -1 } },
  { $limit: 3 }
])
4 Cas

Statistiques par statut

Combien de campagnes par statut ? Un simple $group sur statut.

db.campagnes.aggregate([
  { $group: { _id: "$statut", nb: { $sum: 1 } } }
])

Résultat

{ _id: "OUVERTE", nb: 5 } { _id: "CLOTUREE", nb: 2 } { _id: "LIVREE", nb: 1 }
5 Cas

Répartir en tranches de volume ($bucket)

$bucket classe les campagnes par intervalle de volume — utile pour un graphique.

db.campagnes.aggregate([
  { $unwind: "$commandes" },
  { $group: { _id: "$_id", volume: { $sum: "$commandes.litres" } } },
  { $bucket: {
      groupBy: "$volume",
      boundaries: [0, 3000, 8000, 100000],
      default: "autre",
      output: { nb: { $sum: 1 } }
  }}
])
6 Méthode

Comment construire un pipeline

La bonne méthode : on ajoute les étapes une par une et on vérifie le résultat intermédiaire à chaque fois. Compass propose même un aperçu en direct étape par étape.

🛢️ Sur le projet Fioul Groupé

Garde ces pipelines : le « volume + palier » deviendra le calcul renvoyé par l'API dans le CampagneDTO (champs volumeTotal et prixLitre). Les stats par statut et les tranches alimenteront un futur tableau de bord coordinateur.

Ce qu'il faut retenir du chapitre
  • On compose les étapes du ch. 14 pour répondre à des questions concrètes.
  • $addFields + $switch pour des champs calculés conditionnels.
  • Construire un pipeline pas à pas, en vérifiant chaque étape (Compass aide).
← Chapitre 14