Aggregationsoperationen verarbeiten Datensätze und liefern berechnete Ergebnisse. Aggregationsoperationen fassen Werte aus mehreren Dokumenten zusammen und können eine Vielzahl von Operationen mit den gruppierten Daten durchführen, um ein einziges Ergebnis zu liefern. In SQL ist count(*) und mit group by ein Äquivalent der MongoDB-Aggregation.
Die aggregate()-Methode
Für die Aggregation in MongoDB sollten Sie die aggregate()-Methode verwenden.
Syntax
Die grundlegende Syntax der aggregate()-Methode lautet wie folgt –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Beispiel
In der Sammlung haben Sie die folgenden Daten –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Nun aus der obigen Sammlung, Wenn Sie eine Liste anzeigen möchten, die angibt, wie viele Tutorials von jedem Benutzer geschrieben wurden, verwenden Sie die folgende aggregate()-Methode –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Die äquivalente SQL-Abfrage für den obigen Anwendungsfall lautet select by_user, count(*) from mycol group by_user.
Im obigen Beispiel haben wir die Dokumente nach dem Feld by_user gruppiert und bei jedem Auftreten von by user wird der vorherige Wert von sum erhöht. Es folgt eine Liste der verfügbaren Aggregationsausdrücke.
Ausdruck | Beschreibung | Beispiel |
---|---|---|
$sum | Summiert den definierten Wert aus allen Dokumenten in der Sammlung. | db.mycol.aggregate() |
$avg | Berechnet den Durchschnitt aller angegebenen Werte aus allen Dokumenten in der Sammlung. | db.mycol.aggregate() |
$min | Ermittelt das Minimum der entsprechenden Werte aus allen Dokumenten in der Sammlung. | db.mycol.aggregate() |
$max | Ermittelt das Maximum der entsprechenden Werte aus allen Dokumenten der Sammlung. | db.mycol.aggregate() |
$push | Fügt den Wert in ein Array im Ergebnisdokument ein. | db.mycol.aggregate() |
$addToSet | Fügt den Wert in ein Array im Ergebnisdokument ein, erstellt aber keine Duplikate. | db.mycol.aggregate() |
$first | Gibt das erste Dokument aus den Quelldokumenten entsprechend der Gruppierung. Typischerweise macht dies nur Sinn zusammen mit einer vorher angewandten „$sort“-Stufe. | db.mycol.aggregate() |
$last | Gibt das letzte Dokument aus den Quelldokumenten entsprechend der Gruppierung. Typischerweise macht dies nur in Verbindung mit einer vorher angewendeten „$sort“-Stufe Sinn. | db.mycol.aggregate() |
Pipeline-Konzept
In UNIX-Befehlen bedeutet Shell-Pipeline die Möglichkeit, eine Operation auf einer Eingabe auszuführen und die Ausgabe als Eingabe für den nächsten Befehl zu verwenden usw. MongoDB unterstützt dasselbe Konzept auch im Aggregations-Framework. Es gibt eine Reihe möglicher Stufen, und jede dieser Stufen wird als eine Reihe von Dokumenten als Eingabe genommen und erzeugt eine resultierende Reihe von Dokumenten (oder das endgültige resultierende JSON-Dokument am Ende der Pipeline). Dieses kann dann wiederum für die nächste Stufe verwendet werden usw.
Nachfolgend sind die möglichen Stufen im Aggregations-Framework aufgeführt –
-
$project – Wird verwendet, um einige spezifische Felder aus einer Sammlung auszuwählen.
-
$match – Dies ist ein Filtervorgang und kann daher die Menge der Dokumente reduzieren, die als Eingabe für die nächste Stufe dienen.
-
$group – Dies führt die eigentliche Aggregation wie oben beschrieben durch.
-
$sort – Sortiert die Dokumente.
-
$skip – Damit ist es möglich, in der Liste der Dokumente für eine bestimmte Anzahl von Dokumenten vorwärts zu springen.
-
$limit – Hiermit wird die Anzahl der zu betrachtenden Dokumente, ausgehend von der aktuellen Position, um die angegebene Anzahl begrenzt.
-
$unwind – Hiermit können Dokumente, die Arrays verwenden, entpackt werden. Wenn ein Array verwendet wird, sind die Daten in gewisser Weise vorverknüpft und diese Operation wird damit rückgängig gemacht, um wieder einzelne Dokumente zu erhalten. Mit diesem Schritt wird die Anzahl der Dokumente für den nächsten Schritt erhöht.