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
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 } }
}}
])
$addFields ajoute un champ calculé sans supprimer les autres. $switch est un « si/sinon » dans le pipeline.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 }
])
Statistiques par statut
Combien de campagnes par statut ? Un simple $group sur statut.
db.campagnes.aggregate([
{ $group: { _id: "$statut", nb: { $sum: 1 } } }
])
Résultat
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 } }
}}
])
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.
- Filtrer d'abord (
$match) pour ne travailler que sur l'utile. - Déplier si besoin (
$unwind), puis regrouper ($group). - Mettre en forme la sortie (
$project/$addFields), trier, limiter.
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.
- On compose les étapes du ch. 14 pour répondre à des questions concrètes.
$addFields+$switchpour des champs calculés conditionnels.- Construire un pipeline pas à pas, en vérifiant chaque étape (Compass aide).