Aller au contenu

Pipelines d'agrégation#

Introduction aux pipelines d'agrégation#

  • Les pipelines d'agrégation permettent de traiter et d'analyser des données dans MongoDB.
  • Les avantages incluent la flexibilité, l'expressivité et la performance.
  • Les pipelines sont composés d'étapes successives qui modifient et filtrent les données.
  • Syntaxe de base de l'agrégation pipeline : db.collection.aggregate([])

Les étapes du pipeline#

$match#

  • Utilisation de $match pour filtrer les documents en fonction de critères spécifiques
  • Équivalent d'une clause WHERE dans SQL
  • Commande : {$match: {}}
  • Exemple : db.sales.aggregate([{$match: {status: "A"}}])

$project#

  • Sélectionner, renommer ou ajouter des champs aux documents.
  • Équivalent d'une clause SELECT dans SQL
  • Commande : {$project: {: , : , ...}}
  • Exemple : db.sales.aggregate([{$project: {_id: 0, item: 1, amount: {$multiply: ["$price", "$quantity"]}}])

$unwind#

  • Transformer un champ de type tableau en plusieurs documents.
  • Commande : {$unwind: {path: , includeArrayIndex: , preserveNullAndEmptyArrays: }}
  • Exemple : db.books.aggregate([{$unwind: "$authors"}])

$group#

  • Regrouper des documents par un ou plusieurs champs.
  • Équivalent d'une clause GROUP BY dans SQL
  • Commande : {$group: {_id: , : {: }, ...}}
  • Exemple : db.sales.aggregate([{$group: {_id: "$status", total: {$sum: "$price"}}}])

$sort#

  • Trier les documents en fonction de critères spécifiés.
  • Équivalent d'une clause ORDER BY dans SQL
  • Commande : {$sort: {: , : , ...}}
  • Exemple : db.sales.aggregate([{$sort: {item: 1, price: -1}}])

$limit#

  • Limiter le nombre de documents retournés.
  • Équivalent d'une clause LIMIT dans SQL
  • Commande : {$limit: }
  • Exemple : db.sales.aggregate([{$limit: 5}])

$skip#

  • Ignorer un certain nombre de documents en début de pipeline.
  • Équivalent d'une clause OFFSET dans SQL
  • Commande : {$skip: }
  • Exemple : db.sales.aggregate([{$skip: 10}])

$lookup#

  • Joindre des documents d'une autre collection.
  • Exemple: {$lookup: {from: 'orders', localField: '_id', foreignField: 'customer_id', as: 'customer_orders'}}

$out#

  • Écrire le résultat du pipeline dans une nouvelle collection.
  • Commande : {$out: }
  • Exemple : db.sales.aggregate([{$match: {status: "A"}}, {$out: "active_sales"}])

Exemples de pipelines d'agrégation#

Exemple 1 : Calculer le total des ventes par statut

db.sales.aggregate([{$group: {_id: "$status", total: {$sum: "$price"}}}])

Exemple 2 : Trouver le nombre moyen d'étoiles par catégorie pour les films ayant plus de 100 votes

db.movies.aggregate([
  {$match: {numVotes: {$gt: 100}}},
  {$group: {_id: "$genre", avgStars: {$avg: "$stars"}}},
  {$sort: {avgStars: -1}}
])

Exemple 3 : Calculer le total des ventes par jour et par produit

db.sales.aggregate([
  {$project: {day: {$dayOfYear: "$date"}, item: 1, price: 1}},
  {$group: {_id: {day: "$day", item: "$item"}, total: {$sum: "$price"}}}
])

Exemple 4 : Trouver le top 3 des clients ayant effectué le plus d'achats

db.orders.aggregate([
  {$group: {_id: "$customerId", totalSpent: {$sum: "$amount"}}},
  {$sort: {totalSpent: -1}},
  {$limit: 3}
])

Exemple 5 : Calculer la répartition des ventes par quartier et par catégorie de produit

db.sales.aggregate([
  {$unwind: "$items"},
  {$group: {_id: {neighborhood: "$neighborhood", category: "$items.category"}, totalSales: {$sum: "$items.price"}}},
  {$sort: {"_id.neighborhood": 1, totalSales: -1}}
])