Wenn MapReduce Ihre erste Wahl war, könnte es jetzt an der Zeit sein, auf die Aggregation Pipeline von MongoDB umzusteigen, um komplexe Vorgänge zu bewältigen.
Die Aggregationspipeline ist die empfohlene Methode zum Ausführen komplexer Abfragen in MongoDB. Wenn Sie MapReduce von MongoDB verwendet haben, sollten Sie für effizientere Berechnungen besser zur Aggregationspipeline wechseln.
Was ist Aggregation in MongoDB und wie funktioniert sie?
Die Aggregationspipeline ist ein mehrstufiger Prozess für die erweiterte Ausführung Abfragen in MongoDB. Es verarbeitet Daten in verschiedenen Phasen, die als Pipeline bezeichnet werden. Sie können die auf einer Ebene generierten Ergebnisse als Operationsvorlage auf einer anderen Ebene verwenden.
Sie können beispielsweise das Ergebnis einer Übereinstimmungsoperation an eine andere Stufe übergeben, um es in dieser Reihenfolge zu sortieren, bis Sie die gewünschte Ausgabe erhalten.
Jede Stufe einer Aggregationspipeline verfügt über einen MongoDB-Operator und generiert ein oder mehrere transformierte Dokumente. Abhängig von Ihrer Abfrage kann eine Ebene mehrmals in der Pipeline erscheinen. Beispielsweise müssen Sie möglicherweise die verwenden
$count oder $sort Der Operator stuft die Aggregationspipeline mehr als einmal ein.Die Phasen der Aggregationspipeline
Die Aggregationspipeline leitet Daten in einer einzigen Abfrage durch mehrere Phasen. Es gibt mehrere Phasen, deren Einzelheiten Sie im finden MongoDB-Dokumentation.
Lassen Sie uns im Folgenden einige der am häufigsten verwendeten definieren.
Die $match-Phase
In dieser Phase können Sie spezifische Filterbedingungen definieren, bevor Sie mit den anderen Aggregationsphasen beginnen. Sie können damit die passenden Daten auswählen, die Sie in die Aggregationspipeline aufnehmen möchten.
Die $group-Bühne
In der Gruppenphase werden Daten anhand bestimmter Kriterien mithilfe von Schlüssel-Wert-Paaren in verschiedene Gruppen unterteilt. Jede Gruppe stellt einen Schlüssel im Ausgabedokument dar.
Betrachten Sie beispielsweise Folgendes Verkäufe Beispieldaten:
Mithilfe der Aggregationspipeline können Sie die Gesamtzahl der Verkäufe und die Top-Verkäufe für jeden Produktabschnitt berechnen:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
Der _id: $Section Das Paar gruppiert das Ausgabedokument basierend auf den Abschnitten. Durch die Angabe der top_sales_count Und top_sales Felder erstellt MongoDB neue Schlüssel basierend auf der vom Aggregator definierten Operation; das kann sein $summe, $min, $max, oder $Durchschn.
Die $skip-Phase
Du kannst den... benutzen $überspringen Stufe, um eine bestimmte Anzahl von Dokumenten in der Ausgabe wegzulassen. Normalerweise findet es nach der Gruppenphase statt. Wenn Sie beispielsweise zwei Ausgabedokumente erwarten, aber eines überspringen, gibt die Aggregation nur das zweite Dokument aus.
Um eine Sprungstufe hinzuzufügen, fügen Sie die ein $überspringen Operation in die Aggregationspipeline:
...,
{
$skip: 1
},
Die $sort-Bühne
Mit der Sortierstufe können Sie Daten in absteigender oder aufsteigender Reihenfolge anordnen. Beispielsweise können wir die Daten im vorherigen Abfragebeispiel weiter in absteigender Reihenfolge sortieren, um zu ermitteln, welcher Abschnitt die höchsten Umsätze aufweist.
Ergänzen Sie die $sort Operator zur vorherigen Abfrage:
...,
{
$sort: {top_sales: -1}
},
Die $limit-Phase
Der Begrenzungsvorgang trägt dazu bei, die Anzahl der Ausgabedokumente zu reduzieren, die die Aggregationspipeline anzeigen soll. Verwenden Sie zum Beispiel die $limit Operator, um den Abschnitt mit den höchsten Umsätzen abzurufen, die in der vorherigen Stufe zurückgegeben wurden:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Das Obige gibt nur das erste Dokument zurück; Dies ist der Abschnitt mit den höchsten Umsätzen, da er oben in der sortierten Ausgabe erscheint.
Die $project-Phase
Der $Projekt Mit Stage können Sie das Ausgabedokument nach Ihren Wünschen gestalten. Verwendung der $Projekt Mit dem Operator können Sie angeben, welches Feld in die Ausgabe einbezogen werden soll, und seinen Schlüsselnamen anpassen.
Zum Beispiel eine Beispielausgabe ohne $Projekt Bühne sieht so aus:
Mal sehen, wie es damit aussieht $Projekt Bühne. Um das hinzuzufügen $Projekt zur Pipeline:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Da wir die Daten zuvor nach Produktabschnitten gruppiert haben, umfasst das Obige jeden Produktabschnitt im Ausgabedokument. Es stellt außerdem sicher, dass die aggregierte Verkaufszahl und die Top-Verkäufe in der Ausgabe enthalten sind Gesamtverkauft Und TopSale.
Die Endausgabe ist im Vergleich zur vorherigen viel sauberer:
Die $unwind-Phase
Der $entspannen Stage zerlegt ein Array innerhalb eines Dokuments in einzelne Dokumente. Nehmen Sie Folgendes Aufträge Daten, zum Beispiel:
Benutzen Sie die $entspannen Bühne, um die zu dekonstruieren Artikel Array, bevor Sie andere Aggregationsstufen anwenden. Zum Beispiel das Abwickeln der Artikel array ist sinnvoll, wenn Sie den Gesamtumsatz für jedes Produkt berechnen möchten:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Hier ist das Ergebnis der obigen Aggregationsabfrage:
So erstellen Sie eine Aggregationspipeline in MongoDB
Während die Aggregationspipeline mehrere Vorgänge umfasst, vermitteln Ihnen die zuvor vorgestellten Phasen eine Vorstellung davon, wie diese in der Pipeline angewendet werden, einschließlich der grundlegenden Abfrage für jeden.
Verwendung des vorherigen Verkäufe Lassen Sie uns anhand eines Datenbeispiels einige der oben besprochenen Phasen in einem Stück zusammenfassen, um einen umfassenderen Überblick über die Aggregationspipeline zu erhalten:
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}},
{
"$sort": { "top_sales": -1 }
},{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
Die endgültige Ausgabe sieht aus wie etwas, das Sie zuvor gesehen haben:
Aggregationspipeline vs. Karte verkleinern
Bis zur Abschaffung ab MongoDB 5.0 war die herkömmliche Methode zum Aggregieren von Daten in MongoDB die Verwendung von MapReduce. Obwohl MapReduce hat breitere Anwendungsmöglichkeiten Abgesehen von MongoDB ist es weniger effizient als die Aggregationspipeline und erfordert Skripte von Drittanbietern, um die Karte zu schreiben und Funktionen separat zu reduzieren.
Die Aggregationspipeline hingegen ist nur für MongoDB spezifisch. Aber es bietet eine sauberere und effizientere Möglichkeit, komplexe Abfragen auszuführen. Neben der Einfachheit und Skalierbarkeit der Abfrage machen die vorgestellten Pipeline-Stufen die Ausgabe anpassbarer.
Es gibt viele mehr Unterschiede zwischen der Aggregationspipeline und MapReduce. Sie werden sie sehen, wenn Sie von MapReduce zur Aggregationspipeline wechseln.
Machen Sie Big-Data-Abfragen in MongoDB effizient
Ihre Abfrage muss so effizient wie möglich sein, wenn Sie detaillierte Berechnungen für komplexe Daten in MongoDB durchführen möchten. Die Aggregationspipeline eignet sich ideal für erweiterte Abfragen. Anstatt Daten in separaten Vorgängen zu bearbeiten, was oft die Leistung beeinträchtigt, können Sie durch die Aggregation alle Daten in eine einzige leistungsstarke Pipeline packen und einmal ausführen.
Die Aggregationspipeline ist zwar effizienter als MapReduce, Sie können die Aggregation jedoch schneller und effizienter gestalten, indem Sie Ihre Daten indizieren. Dadurch wird die Datenmenge begrenzt, die MongoDB während jeder Aggregationsphase scannen muss.