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([<pipeline stages>])
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: {<query>}}
- 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: {<field1>: <expression1>, <field2>: <expression2>, ...}}
- 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: <field path>, includeArrayIndex: <string>, preserveNullAndEmptyArrays: <boolean>}}
- 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: <expression>, <field1>: {<accumulator>: <expression1>}, ...}}
- 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: {<field1>: <sort order>, <field2>: <sort order>, ...}}
- 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: <positive integer>}
- 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: <positive integer>}
- 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: <collection name>}
- 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}}
])