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:

AusdruckBeschreibungBeispiel
$sumBerechnet die Summe.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avgBerechnet den Durchschnittdb.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$minErmittelt den Minimalwert, der allen Dokumenten in der Sammlung entspricht.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$maxErmittelt den Maximalwert, der allen Dokumenten in der Sammlung entspricht.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$pushFügt Werte zu einem Array hinzu, ohne auf doppelte Werte zu prüfen.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSetFü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"}}}])
$firstRuft die ersten Dokumentdaten gemäß der Sortierung der Quelldokumente ab.db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$lastRuft 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