Erste Schritte mit der Aggregationspipeline

Von Bedeutung

Möchten Sie eine vorhandene MongoDB-Anwendung migrieren oder MongoDB Query Language (MQL)-Features verwenden? Betrachten Sie Azure DocumentDB.

Suchen Sie nach einer Datenbanklösung für hochskalige Szenarien mit einer Vereinbarung über verfügbarkeitsbasierte Servicelevels (Service Level Agreement, SLA) von 99,999% Verfügbarkeit, sofortige Automatische Skalierung und automatisches Failover über mehrere Regionen hinweg? Betrachten Sie Azure Cosmos DB für NoSQL.

Die Aggregationspipeline ist ein leistungsstarkes Tool, mit dem Entwickler erweiterte Datenanalysen und -bearbeitungen für ihre Sammlungen durchführen können. Bei der Pipeline handelt es sich um eine Reihe von Datenverarbeitungsvorgängen, die für die Eingabedokumente ausgeführt werden, um eine berechnete Ausgabe zu generieren. Die Pipelinephasen verarbeiten die Eingabedokumente und übergeben das Ergebnis jeweils an die nächste Phase. In jeder Phase wird ein bestimmter Vorgang für die Daten ausgeführt. Beispiele wären etwa Filtern, Gruppieren, Sortieren und Transformieren.

Allgemeine Syntax

Die grundlegende Syntax für eine Aggregationspipeline lautet wie folgt:

db.collection.aggregate([    { stage1 },    { stage2 },    ...    { stageN }])

Hierbei ist „db.collection“ die MongoDB-Sammlung, für die Sie die Aggregation ausführen möchten, und „stage1“, „stage2“, ..., „stageN“ sind die anzuwendenden Pipelinephasen.

Beispielphasen

Cosmos DB for MongoDB bietet ein breites Spektrum an Phasen, die Sie in Ihrer Pipeline verwenden können. Hierzu zählen unter anderem folgende:

  • $match: Filtert die Dokumente so, dass nur die Dokumente übergeben werden, die der angegebenen Bedingung entsprechen.
  • $project: Transformiert die Dokumente in ein neues Format, indem Felder hinzugefügt, entfernt oder aktualisiert werden.
  • $group: Gruppiert Dokumente nach einem oder mehreren Feldern und führt verschiedene Aggregatfunktionen für die gruppierten Daten aus.
  • $sort: Sortiert die Dokumente basierend auf den angegebenen Feldern.
  • $skip: Überspringt die angegebene Anzahl von Dokumenten.
  • $limit: Begrenzt die Anzahl von Dokumenten, die an die nächste Phase übergeben werden.
  • $unwind: Dekonstruiert ein Arrayfeld aus den Eingabedokumenten, um ein Dokument für jedes Element auszugeben.

Alle verfügbaren Stufen sehen Sie unter unterstützte Features.

Beispiele

Im Folgenden finden Sie einige Beispiele dafür, wie Sie die Aggregationspipeline verwenden können, um verschiedene Vorgänge für Ihre Daten auszuführen:

Filtern: Wenn Sie nach Dokumenten filtern möchten, die ein Mengenfeld (quantity) enthalten, dessen Wert größer als 20 ist, können Sie die folgende Pipeline verwenden:

db.collection.aggregate([
    { $match: { quantity: { $gt: 20 } } }
])

Gruppieren: Wenn Sie Dokumente nach einem Kategoriefeld (category) gruppieren und die Gesamtmenge (quantity) für die einzelnen Gruppen berechnen möchten, können Sie die folgende Pipeline verwenden:

db.collection.aggregate([
    { $group: { _id: "$category", totalQuantity: { $sum: "$quantity" } } }
])

Sortieren: Wenn Sie Dokumente absteigend nach dem Preisfeld (price) sortieren möchten, können Sie die folgende Pipeline verwenden:

db.collection.aggregate([
    { $sort: { price: -1 } }
])

Transformieren: Wenn Sie Dokumenten mit einem Preisfeld (price), dessen Wert größer als 100 ist, ein Rabattfeld (discount) hinzufügen möchten, können Sie die folgende Pipeline verwenden:

db.collection.aggregate([
    { $project: { item: 1, price: 1, discount: { $cond: [{ $gt: ["$price", 100] }, 10, 0 ] } } }
])

Entladen: Wenn Sie alle Unterdokumente aus dem Arrayfeld „tags“ trennen und für jeden Wert ein neues Dokument erstellen möchten, können Sie die folgende Pipeline verwenden:

db.collection.aggregate([
    { $unwind: "$tags" }
])

Beispiel mit mehreren Phasen

db.sales.aggregate([
  { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } },
  { $group: { _id: "$category", totalSales: { $sum: "$sales" } } },
  { $sort: { totalSales: -1 } },
  { $limit: 5 }
])

In diesem Beispiel wird eine Beispielsammlung namens „sales“ (Umsatz) verwendet, die Dokumente mit folgenden Feldern enthält: „date“ (Datum), „category“ (Kategorie) und „sales“ (Umsatz).

In der ersten Phase { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } } werden die Dokumente nach dem Datumsfeld (date) gefiltert, und es werden nur Dokumente zurückgegeben, deren Datum zwischen dem 1. Januar 2021 und dem 28. Februar 2021 liegt. Hier wird das Zeichenfolgendatumsformat „JJJJ-MM-TT“ verwendet.

In der zweiten Phase { $group: { _id: "$category", totalSales: { $sum: "$sales" } } } werden die Dokumente nach dem Kategoriefeld (category) gruppiert, und der Gesamtumsatz für die einzelnen Gruppen wird berechnet.

In der dritten Phase { $sort: { totalSales: -1 } } werden die Dokumente absteigend nach dem Feld für den Gesamtumsatz (totalSales) sortiert.

In der vierten Phase { $limit: 5 } wird die Anzahl von Dokumenten begrenzt, sodass nur die obersten fünf Dokumente an die nächste Phase übergegeben werden.

Somit gibt die Pipeline die fünf wichtigsten Kategorien nach Gesamtumsatz für den angegebenen Datumsbereich zurück.

Nächste Schritte