$match ·
$group ·
$project ·
$sort ·
$lookup ·
$unwind
Die Aggregation Pipeline ist MongoDBs leistungsstarkes Framework für Datenanalysen und Transformationen. Sie durchläuft Dokumente Schritt für Schritt und ermöglicht komplexe Abfragen, Gruppierungen und Joins.
$match filtert Dokumente ähnlich wie find() in der Aggregation Pipeline. Es sollte möglichst früh in der Pipeline stehen, um die Datenmenge zu reduzieren.
$match so früh wie möglich in der Pipeline, um die Anzahl der zu verarbeitenden Dokumente zu reduzieren – das verbessert die Performance erheblich.
$group gruppiert Dokumente nach einem Schlüssel (_id) und berechnet Aggregationen wie Summe, Durchschnitt, Minimum, Maximum oder zählt Dokumente.
| Operator | Beschreibung | Beispiel |
|---|---|---|
| $sum | Summiert Werte | { $sum: "$amount" } |
| $avg | Durchschnitt berechnen | { $avg: "$price" } |
| $min | Minimalwert | { $min: "$age" } |
| $max | Maximalwert | { $max: "$age" } |
| $count | Anzahl Dokumente | { $sum: 1 } |
| $push | Array von Werten | { $push: "$name" } |
| $addToSet | Eindeutige Werte | { $addToSet: "$category" } |
$group mit $push ist nützlich, um Arrays von Werten pro Gruppe zu erstellen – z.B. alle Produktnamen pro Kategorie.
$project wählt Felder aus, schließt sie aus oder erstellt neue berechnete Felder. Es formt die Dokumente für die weitere Verarbeitung um.
$project am Ende der Pipeline, um die Ausgabe zu formatieren. In der Mitte der Pipeline kann es helfen, die Dokumentstruktur für nachfolgende Stages anzupassen.
$sort sortiert Dokumente (1 = aufsteigend, -1 = absteigend). $limit begrenzt die Anzahl der Dokumente. Werden oft nach $group verwendet, um Top-Listen zu erstellen.
$sort so früh wie möglich in der Pipeline, wenn Sie Indizes nutzen können. $limit nach $sort reduziert die Datenmenge für nachfolgende Stages.
$lookup führt eine Left Outer Join zwischen der aktuellen Collection und einer anderen Collection durch. Die Ergebnisse werden als Array in das angegebene Feld (as) eingefügt.
$lookup erzeugt ein Array. Mit $unwind können Sie das Array in einzelne Dokumente aufteilen. Für effiziente Joins sollten Sie Indizes auf foreignField anlegen.
$unwind dekonstruiert ein Array-Feld: Für jedes Element des Arrays wird ein separates Dokument erzeugt. Nützlich für die Verarbeitung von Arrays in der Aggregation Pipeline.
$unwind kann die Anzahl der Dokumente stark erhöhen. Verwenden Sie preserveNullAndEmptyArrays: true, wenn Sie Dokumente mit leeren Arrays nicht verlieren möchten.
$match
$group
$project
$sort
$lookup
$unwind
db.orders.aggregate([ { $match: { total: { $gt: 100 } } }, { $group: { _id: "$category", total: { $sum: 1 } } }, { $sort: { total: -1 } }, { $limit: 5 }])