Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
$ setzen WindowFields
Neu ab Version 8.0.2.
Die $setWindowFields Phase in Amazon DocumentDB führt Operationen für einen bestimmten Bereich von Dokumenten (ein Fenster) in einer Partition durch und gibt die Ergebnisse auf der Grundlage des ausgewählten Fensteroperators zurück. Die Phase gruppiert die Eingabedokumente in Partitionen, sortiert sie optional und berechnet für jedes Dokument ein oder mehrere Ausgabefelder über ein Fenster mit umgebenden Dokumenten.
Syntax
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <sortField1>: <sortOrder>, ... }, output: { <outputField1>: { <windowOperator>: <expression>, window: { documents: [ <lowerBound>, <upperBound> ], range: [ <lowerBound>, <upperBound> ], unit: <time unit> } }, ... } } }
Parameter
-
partitionBy: Optional. Ein einzelner Ausdruck, der verwendet wird, um die Dokumente in Partitionen zu gruppieren. Dies kann ein Feldpfad (z. B."$state") oder ein anderer Ausdruck sein. Wenn es weggelassen wird, gehören alle Eingabedokumente zu einer einzigen Partition. -
sortBy: Optional. Ein Dokument, das das Feld oder die Felder angibt, nach denen die Dokumente in jeder Partition sortiert werden sollen, und zwar in der Form{ <field>: 1 }für aufsteigende oder{ <field>: -1 }für absteigende Reihenfolge. AsortByist erforderlich, wenn Sie dokument- oder bereichsbasierte Fenstergrenzen verwenden und wenn Sie einen der Operatoren für die Rangfolge verwenden. -
output: Erforderlich. Ein Dokument, das die Felder angibt, die an jedes Dokument angehängt werden sollen. Sie können mehrere Ausgabefelder angeben, aber jedes Ausgabefeld benötigt genau einen Fensteroperator, sein Argument und ein optionaleswindowDokument, das die Fenstergrenzen definiert:{ <field>: { <windowOperator>: <expression>, window: { ... } } }.
Fenstergrenzen
In jedem output Feld können Sie optional die Fenstergrenzen mit einem window Dokument definieren. Ein Fenster kann anhand der Dokumentposition oder anhand eines Wertebereichs definiert werden.
-
documents: Gibt das Fenster als eine Anzahl von Dokumenten vor und nach dem aktuellen Dokument im Formular an[ <lowerBound>, <upperBound> ]. Jede Grenze ist ein Ganzzahl-Offset (z. B.-1oder2) oder eines der Schlüsselwörter"unbounded"und"current"."unbounded"erweitert das Fenster bis zum Anfang der Partition, wenn es als Untergrenze verwendet wird, oder bis zum Ende der Partition, wenn es als Obergrenze verwendet wird."current"bedeutet das aktuelle Dokument. EindocumentsFenster benötigt einen,sortByes sei denn, beide Grenzen sind"unbounded"gleich. -
range: Gibt das Fenster als einen Bereich vonsortByFeldwerten im Verhältnis zum aktuellen Dokument im Formular[ <lowerBound>, <upperBound> ]an. Jede Grenze ist eine Zahl, die demsortByWert des aktuellen Dokuments oder dem"unbounded"Schlüsselwort hinzugefügt wird. EinrangeFenster benötigt genau ein aufsteigendessortByFeld und akzeptiert das"current"Schlüsselwort nicht. -
unit: Optional. Wird verwendetrange, um die numerischen Fenstergrenzen als Zeitspanne zu interpretieren, in der dassortByFeld Datumswerte enthält. Amazon DocumentDB unterstützt die folgenden Einheiten:"year""quarter","month","week",,"day","hour""minute""second", und."millisecond"Wennunitangegeben, müssen dierangeGrenzen ganze Zahlen sein.
Wenn das window Dokument weggelassen wird, wird das Standardfenster verwendetdocuments: ["unbounded", "unbounded"], das sich über die gesamte Partition erstreckt.
Anmerkung
Wenn Sie ein range Fenster verwenden, das Datumswerten vorzieht, empfehlen wir eine feste Dauer unit wie "day" (oder kleiner) und nicht, oder "month" "quarter""year", deren kalenderabhängige Länge zu mehrdeutigen Fenstergrenzen führen kann.
Unterstützte Fensteroperatoren
Amazon DocumentDB unterstützt die folgenden 26 Fensteroperatoren im output Bereich der $setWindowFields Bühne:
$sum$avg$count$push$addToSet$stdDevPop$stdDevSamp$covariancePop$covarianceSamp$first$last$firstN$lastN$top$bottom$topN$bottomN$min$minN$max$maxN$median$percentile$rank$denseRank$documentNumber
Anmerkung
Der $rand Operator wird innerhalb eines Fensteroperators in der $setWindowFields Bühne nicht unterstützt.
Leere Fenster
Wenn ein Fenster keine Dokumente enthält (z. B. ein range Fenster ohne Werte im Bereich), hängt das Ergebnis vom Operator ab: $count und gibt $sum zurück0;$push,,,,,,, $addToSet $firstN $lastN $minN $maxN$topN, und gibt ein leeres Array $percentile zurück; gibt ein Array von null Werten zurück (einen pro angefordertem Perzentil); alle anderen Operatoren $bottomN kehren zurück. null
Beispiel (MongoDB Shell)
Das folgende Beispiel partitioniert die Dokumente nachregion, sortiert jede Partition nach day und berechnet eine laufende Summe revenue vom Anfang der Partition bis zum aktuellen Dokument.
Erstellen Sie Beispieldokumente
db.sales.insertMany([ { _id: 1, region: "east", day: 1, revenue: 100 }, { _id: 2, region: "east", day: 2, revenue: 150 }, { _id: 3, region: "east", day: 3, revenue: 120 }, { _id: 4, region: "west", day: 1, revenue: 200 }, { _id: 5, region: "west", day: 2, revenue: 180 } ]);
Beispiel für eine Abfrage
db.sales.aggregate([ { $setWindowFields: { partitionBy: "$region", sortBy: { day: 1 }, output: { runningRevenue: { $sum: "$revenue", window: { documents: ["unbounded", "current"] } } } } } ]);
Ausgabe
[
{ "_id": 1, "region": "east", "day": 1, "revenue": 100, "runningRevenue": 100 },
{ "_id": 2, "region": "east", "day": 2, "revenue": 150, "runningRevenue": 250 },
{ "_id": 3, "region": "east", "day": 3, "revenue": 120, "runningRevenue": 370 },
{ "_id": 4, "region": "west", "day": 1, "revenue": 200, "runningRevenue": 200 },
{ "_id": 5, "region": "west", "day": 2, "revenue": 180, "runningRevenue": 380 }
]
Jedes Dokument wird um die kumulative Summe revenue innerhalb seiner Partition bis einschließlich des aktuellen Dokuments erweitert. runningRevenue
Codebeispiele
Um ein Codebeispiel für die Verwendung der $setWindowFields Bühne anzuzeigen, wählen Sie die Registerkarte für die Sprache, die Sie verwenden möchten: