Einführung

In diesem Artikel werde ich Ihnen die Mongodb Gruppe nach mehreren Feldern vorstellen. Zum besseren Verständnis werden wir zunächst die Aggregationsfunktion kennenlernen.

MongoDB Aggregationsfunktion

Aggregationsfunktionen werden in GROUP BY-Klauseln verwendet, um gruppierte Daten zu aggregieren. Aggregatfunktionen funktionieren besser, wenn sie mit der GROUP BY-Klausel verwendet werden. Die Verwendung von Aggregatfunktionen ist jedoch nicht auf gruppierte Abfragen beschränkt.

Wenn eine Aggregatfunktion in einer Abfrage ohne die GROUP BY-Klausel verwendet wird, aggregiert die Aggregatfunktion die gesamte Ergebnismenge (alle Zeilen, die der WHERE-Klausel entsprechen). Wenn Sie die GROUP BY-Klausel nicht verwenden, können einige Aggregatfunktionen in der SELECT-Liste nur mit anderen Aggregatfunktionen verwendet werden. Deshalb muss die Aggregatfunktion die GROUP BY-Klausel verwenden, um sich mit der Liste in der SELECT-Liste zu verbinden.

Anstatt die GROUP BY-Klausel zu verwenden, kann AVG in einer SELECT-Liste beispielsweise nur SUMME entsprechen, aber nicht einer bestimmten Spalte.

Die MongoDB-Aggregationsoperation wird für Batch-Operationen an den Daten verwendet. Nachdem die Sammlung nach Bedingungen gruppiert wurde, werden eine Reihe von Operationen wie Summe, Durchschnitt und andere durchgeführt. Aggregationsoperationen können komplexe Sammlungsoperationen durchführen, insbesondere für mathematische Statistiken und Data Mining.

Die Eingabe der Aggregationsoperation in MongoDB ist das Sammlungsdokument. Die Ausgabe kann ein oder mehrere Dokumente sein. MongoDB bietet eine sehr leistungsfähige Aggregationsoperation, die in drei Kategorien unterteilt werden kann:

  • Aggregationspipeline
  • Aggregationsoperation zur einmaligen Verwendung
  • MapReduce-Programmiermodell

Mongodb Group by Multiple Fields

Der Operator $ group ist ein Aggregator, der ein neues Dokument zurückgibt. Es hat seinen eigenen Operator, wir können das Feld des aktuellen Dokuments durch das Symbol $ + Feldname erhalten. Um die MongoDB-Gruppe nach mehreren Feldern zu verstehen, sehen wir uns zunächst eine Liste aller Operatoren an, die in $ group verwendet werden können:

  • $ sum – Gibt die Summe aller numerischen Felder zurück.
  • $ avg – Berechnet den Durchschnitt zwischen numerischen Feldern.
  • $ min – Gibt den Mindestwert aus dem numerischen Feld zurück
  • $ max – Holt den Höchstwert aus dem numerischen Feld.
  • $ push – Fügt den Feldwert in das Ergebnisfeld ein
  • $ addToSet – Fügt einen Wert in ein Array des Ergebnisdokuments ein, erzeugt aber keine Duplikate.
  • $ first – Holt nur das erste Dokument aus den gruppierten, normalerweise zum Sortieren.
  • $ last – Gibt das letzte Dokument zurück.

Aggregation pipeline

Im multi-threaded POSIX Modus gibt es eine Methode, die Pipeline genannt wird, deren Datenelementstrom sequentiell von einer Reihe von Threads in der angegebenen Reihenfolge ausgeführt wird.Die Aggregationspipeline besteht aus einer Stufe. Nach der Verarbeitung des Dokuments in einer Stufe übergibt die Aggregationspipeline das Verarbeitungsergebnis an die nächste Stufe.

Polymerrohrfunktion Filtert das Dokument, um herauszufinden, welche Dokumente die Kriterien erfüllen. Konvertieren Sie das Dokument und ändern Sie die Ausgabeform des Dokuments.

Jede Stufe der Aggregationspipeline wird mit Stufenoperatoren definiert, und jeder Stufenoperator kann Ausdrucksoperatoren verwenden, um die Summe, den Durchschnitt, die Verkettung oder den Zeilenumbruch vor jeder Stufe zu berechnen. Das Ergebnis wird am Ende zurückgegeben, und das zurückgegebene Ergebnis kann direkt ausgegeben oder in der Sammlung gespeichert werden.

Verarbeitungsablauf

  • Db.collection.aggregate () kann mehrere Kanäle gleichzeitig zur Datenverarbeitung verwenden.
  • Db.collection.aggregate () verwendet die nativen Operationen von MongoDB, um effizient zu aggregieren und Operationen wie GroupBy in SQL zu unterstützen, ohne dass benutzerdefinierte JS-Routinen geschrieben werden müssen.
  • Jede Phase der Pipeline ist auf 100 MB Speicher begrenzt. Wenn eine Single-Node-Pipeline diese Grenze überschreitet, generiert MongoDB einen Fehler. Um große Datenmengen zu verarbeiten, setzen Sie die Eigenschaft allowDiskUse auf true, um Daten in eine temporäre Datei für einen aggregierten Pipeline-Knoten zu schreiben und ein Speicherlimit von 100 MB zuzulassen.
  • Db.collection.aggregate () kann auf eine Reihe von Slices angewendet werden, aber das Ergebnis kann in der Reihe von Slices nicht verloren gehen. MapReduce kann auf eine Reihe von Slices angewandt werden, und das Ergebnis kann in einer Reihe von Slices verloren gehen.
  • Db.collection.aggregate () gibt einen Cursor zurück, die Daten werden im Speicher gespeichert und können direkt als MongoShell verwaltet werden.
  • Die Ausgabe von db.collection.aggregate () kann nur in einem Dokument gespeichert werden, und die Größe des BSON-Dokuments ist auf 16 MB begrenzt.

Gruppierungsmethode

Die Verwendung der Gruppierungsmethode ähnelt der Verwendung der GROUP BY-Klausel in SQL. Die Gruppenmethode hat drei Parameter:

  • Schlüssel: Zeigt den Schlüssel der Gruppe an
  • Initial: Initialisiert das Dokumentfeld, das die Dokumentgruppe darstellt
  • Reduzieren: Eine Funktion, die die Anzahl der Elemente zurückgibt. Diese Funktion verwendet zwei Parameter als Argumente: das aktuelle Element und das aggregierte Ergebnisdokument für die aktuelle Gruppe.
  • Keyf: optionaler Parameter. Verwenden Sie eine andere Funktion als das Schlüsselargument, um das zurückgegebene Schlüsselobjekt darzustellen.
  • Kond: optionaler Parameter. Gibt an, dass die Bedingung true zurückgeben soll, andernfalls wird das Dokument nicht an der Gruppierung teilnehmen. Wenn dieser Parameter nicht angegeben wird, nehmen alle Dokumente an der Gruppierung teil.
  • Finalize: optionaler Parameter. Dies stellt eine Funktion dar, die ausgelöst wird, bevor ein gruppiertes Ergebnis zurückgegeben wird.

Beispiel:`js> db.users.group ({key: {name : true}, initial: {total : 0},reduce : function (curr, res){res.total += 1}})`

Schauen wir uns den Ausdruck an. Der Parameter key gibt an, dass die Gruppe nach dem Namen gruppiert werden soll: key: {name: true}

Der Wert des Parameters initial initialisiert die Felder, die das Ergebnisdokument für die Gruppe darstellen. In diesem Fall wird der Anfangswert des Feldes total gesetzt. Dieses Feld gibt die Anzahl der Elemente in der Gruppe an. Da es möglicherweise keine Elemente gibt, wird auf Null initialisiert.

Der Parameter reduce stellt eine Funktion dar, bei der der Parameter curr auf das aktuelle Objekt in der Gruppe zeigt und res die aktuelle Gruppe darstellt. Wenn Sie ein anderes Objekt mit einem bestimmten Wert für das Feld name finden, fügen Sie dieses Dokument zur Gruppe hinzu und erhöhen den Gesamtwert im Dokument res um 1.

Die Verwendung von $group

Die $group verwendet _id, um den Schlüsselnamen anzugeben, der gruppiert werden soll, wobei die benutzerdefinierte Feldstatistik verwendet wird. Durch die Verwendung der Aggregat-Operation wird das Konzept der Mongodb-Gruppe nach mehreren Feldern aufgehoben.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
db.users.aggregate({
$match : { age: { $gte : 18 } }
},{
$group : { _id:$username, count:{$sum:1} }
});
// Mongodb Gruppe nach mehreren Feldern
db.users.aggregate({
$match: {age: {$gte:18} }},
$group: {_id:{username:$username, age:$ge}, ‚count‘:{$sum:1} }
})
// $sum:val Addiere val zu jedem Dokument
// $avg:val Mittelwert des Wertes jedes Dokuments
db.users.aggregate({
$group: { _id:$username, count:{$avg:$age} }
})
db.users.aggregate({
$group: { _id:$username, count:{$max:$age} }
})
db.users.aggregate({
$group: {_id:$Benutzername, count:{$min:$Alter} }
})
// $first:val Werde erster in der Gruppe
db.users.aggregate({
$group:{_id:$Benutzername, count:{$first: $Alter} }
db.users.aggregate({
$group:{_id:$username, count:{$last: $age} }
})
db.users.aggregate({
$group: {_id:$username, count:{$addToSet: $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$push: $age} }
})

Mongodb gruppiert nach mehreren Feldern mit Aggregate-Operation

Zuerst wird der Schlüssel, auf dem die Gruppierung basiert, ausgewählt und dann wird die Sammlung in Gruppen entsprechend dem ausgewählten Schlüsselwert unterteilt. Sie können dann ein endgültiges Dokument erstellen, indem Sie die Dokumente in jeder Gruppe aggregieren.

Die Gruppe unterstützt keine fragmentierten Cluster und kann kein Shard-Clustering durchführen. Wenn Sie verteilte Unterstützung benötigen, müssen Sie aggregate oder mapReduce verwenden.

1
2
3
4
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Grouping field
key:{key1, key2:1},
# Query conditions
cond:{},
# Aggregate function
reduce:function(current, result){},
# initialization
initial:{},
# Counting Return Function Set
finalize:function(){}
}

Berechne die Anzahl der Elemente in jeder Spalte

1
2
3
4
5
6
7
8
9
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({
key:{category_id:1},
cond:{},// alle zusammen
reduce:function(current, result){// Entspricht der aktuellen Zeile,result Entspricht mehreren Zeilen in der Gruppe
result.total += 1;
},
initial:{total:0}
})

Abschluss

Dieser Artikel ist für die Entwickler geschrieben, um die Mongodb-Gruppe nach mehreren Feldern mit Aggregatfunktion zu verstehen. Wenn Sie diesen Artikel nützlich finden, besuchen Sie Object Rocket weiterhin für weitere datenbankbezogene Artikel.

Wenn Sie Rat oder Hilfe bei der Verwaltung Ihrer Datenbanksicherheit, Skalierbarkeit oder Backups benötigen, zögern Sie nicht, uns bei Object Rocket zu kontaktieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.