MongoDB-Aggregation
In MongoDB wird die Aggregation hauptsächlich verwendet, um Daten zu verarbeiten (z. B. Berechnen von Durchschnitten, Summen usw.) und die berechneten Ergebnisse zurückzugeben.
etwas ähnlich wieSQLin der SQL-Anweisungcount(*)。
aggregate()-Methode
Die Aggregationsmethode in MongoDB verwendet aggregate().
Syntax
Das grundlegende Syntaxformat der aggregate()-Methode lautet wie folgt:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Beispiel
Die Daten in der Collection sind wie folgt:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'example.com',
url: 'http://www.example.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'example.com',
url: 'http://www.example.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Nun verwenden wir die obige Collection, um die Anzahl der von jedem Autor geschriebenen Artikel zu berechnen. Das Ergebnis der Verwendung von aggregate() ist wie folgt:
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "example.com",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
>
Das obige Beispiel ähnelt der SQL-Anweisung:
select by_user, count(*) from mycol group by by_user
Im obigen Beispiel gruppieren wir die Daten nach dem Feld by_user und berechnen die Summe der gleichen Werte im Feld by_user.
Die folgende Tabelle zeigt einige Aggregationsausdrücke:
| Ausdruck | Beschreibung | Beispiel |
|---|---|---|
| $sum | Berechnet die Summe. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
| $avg | Berechnet den Durchschnitt | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
| $min | Ermittelt den Minimalwert, der allen Dokumenten in der Sammlung entspricht. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
| $max | Ermittelt den Maximalwert, der allen Dokumenten in der Sammlung entspricht. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
| $push | Fügt Werte zu einem Array hinzu, ohne auf doppelte Werte zu prüfen. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
| $addToSet | Fügt Werte zu einem Array hinzu, wobei auf Duplikate geprüft wird; wenn derselbe Wert bereits im Array vorhanden ist, wird er nicht hinzugefügt. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
| $first | Ruft die ersten Dokumentdaten gemäß der Sortierung der Quelldokumente ab. | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
| $last | Ruft die letzten Dokumentdaten gemäß der Sortierung der Quelldokumente ab. | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
Pipeline-Konzept
In Unix und Linux werden Pipelines im Allgemeinen verwendet, um die Ausgabe des aktuellen Befehls als Argument für den nächsten Befehl zu nehmen.
Die Aggregations-Pipeline von MongoDB verarbeitet MongoDB-Dokumente in einer Pipeline-Stufe und übergibt die Ergebnisse dann an die nächste Pipeline-Stufe. Pipeline-Operationen können wiederholt werden.
Ausdruck: Verarbeitet Eingabedokumente und gibt Ergebnisse aus. Ausdrücke sind zustandslos und können nur zum Berechnen von Dokumenten in der aktuellen Aggregations-Pipeline verwendet werden; sie können keine anderen Dokumente verarbeiten.
Hier stellen wir einige häufig verwendete Operationen im Aggregations-Framework vor:
- $project: Ändert die Struktur des Eingabedokuments. Es kann verwendet werden, um Felder umzubenennen, hinzuzufügen oder zu entfernen sowie berechnete Ergebnisse und verschachtelte Dokumente zu erstellen.
- $match: Wird verwendet, um Daten zu filtern und nur Dokumente auszugeben, die die Bedingungen erfüllen. $match verwendet die Standardabfrageoperationen von MongoDB.
- $limit: Wird verwendet, um die Anzahl der von der MongoDB-Aggregations-Pipeline zurückgegebenen Dokumente zu begrenzen.
- $skip: Überspringt eine angegebene Anzahl von Dokumenten in der Aggregations-Pipeline und gibt die verbleibenden Dokumente zurück.
- $unwind: Teilt ein Feld vom Typ Array in einem Dokument in mehrere Dokumente auf, von denen jedes einen Wert aus dem Array enthält.
- $group: Gruppiert Dokumente in einer Sammlung, was für statistische Ergebnisse verwendet werden kann.
- $sort: Sortiert die Eingabedokumente und gibt sie aus.
- $geoNear: Gibt geordnete Dokumente aus, die sich in der Nähe eines bestimmten geografischen Standorts befinden.
Beispiele für Pipeline-Operatoren
1. $project-Beispiel
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
Auf diese Weise enthält das Ergebnis nur die drei Felder: _id, tilte und author. Standardmäßig ist das Feld _id enthalten. Wenn Sie _id nicht einschließen möchten, können Sie dies tun:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2. $match-Beispiel
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match wird verwendet, um Datensätze mit Punktzahlen größer als 70 und kleiner oder gleich 90 abzurufen und die übereinstimmenden Datensätze dann zur Verarbeitung an die nächste Stufe, den $group-Pipeline-Operator, weiterzuleiten.
3. $skip-Beispiel
db.article.aggregate(
{ $skip : 5 });
Nach der Verarbeitung durch den $skip-Pipeline-Operator werden die ersten fünf Dokumente herausgefiltert.
Weitere Erweiterungen