Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
$set WindowFields
Nuovo dalla versione 8.0.2.
La $setWindowFields fase di Amazon DocumentDB esegue operazioni su un determinato intervallo di documenti (una finestra) in una partizione e restituisce i risultati in base all'operatore di finestra scelto. La fase raggruppa i documenti di input in partizioni, facoltativamente li ordina e per ogni documento calcola uno o più campi di output su una finestra di documenti circostanti.
Sintassi
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <sortField1>: <sortOrder>, ... }, output: { <outputField1>: { <windowOperator>: <expression>, window: { documents: [ <lowerBound>, <upperBound> ], range: [ <lowerBound>, <upperBound> ], unit: <time unit> } }, ... } } }
Parametri
-
partitionBy: facoltativo. Una singola espressione utilizzata per raggruppare i documenti in partizioni. Può essere un percorso di campo (ad esempio"$state") o un'altra espressione. Se omesso, tutti i documenti di input appartengono a una singola partizione. -
sortBy: facoltativo. Un documento che specifica il campo o i campi in base ai quali ordinare i documenti di ciascuna partizione, in ordine crescente o decrescente.{ <field>: 1 }{ <field>: -1 }AsortByè obbligatorio quando si utilizzano limiti di finestra basati su documenti o intervalli e quando si utilizza uno degli operatori di classificazione. -
output: richiesto. Un documento che specifica i campi da aggiungere a ciascun documento. È possibile specificare più campi di output, ma ogni campo di output richiede esattamente un operatore di finestra, il relativo argomento e unwindowdocumento opzionale che definisce i limiti della finestra:.{ <field>: { <windowOperator>: <expression>, window: { ... } } }
Limiti delle finestre
All'interno di ogni output campo è possibile definire facoltativamente i confini della finestra con un window documento. Una finestra può essere definita in base alla posizione del documento o a un intervallo di valori.
-
documents: specifica la finestra come numero di documenti prima e dopo il documento corrente, nel modulo[ <lowerBound>, <upperBound> ]. Ogni limite è un offset intero (ad esempio,-1o2) o una delle parole chiave and."unbounded""current""unbounded"estende la finestra all'inizio della partizione se utilizzata come limite inferiore o alla fine della partizione se utilizzata come limite superiore."current"indica il documento corrente. Unadocumentsfinestra richiede unsortBya meno che non lo siano entrambi i"unbounded"limiti. -
range: specifica la finestra come un intervallo di valori disortBycampo relativi al documento corrente, nel modulo.[ <lowerBound>, <upperBound> ]Ogni limite è un numero che viene aggiunto alsortByvalore del documento corrente o alla"unbounded"parola chiave. Unarangefinestra richiede esattamente unsortBycampo crescente e non accetta la"current"parola chiave. -
unit: facoltativo. Utilizzato conrangeper interpretare i limiti numerici della finestra come un intervallo di tempo in cui ilsortBycampo contiene valori di data. Amazon DocumentDB supporta le seguenti unità:"year",,"quarter",,"month","week","day""hour","minute"e."second""millisecond"Quandounitè specificato, irangelimiti devono essere numeri interi.
Quando il window documento viene omesso, la finestra predefinita èdocuments: ["unbounded", "unbounded"], che copre l'intera partizione.
Nota
Quando si utilizza una range finestra sui valori di data, si consiglia una durata fissa unit come "day" (o inferiore) anziché"month", o "quarter""year", le cui lunghezze dipendenti dal calendario possono generare limiti ambigui della finestra.
Operatori di finestra supportati
Amazon DocumentDB supporta i seguenti 26 operatori di finestre nel output campo dello $setWindowFields stage:
$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
Nota
L'$randoperatore non è supportato all'interno di un operatore di finestra nello $setWindowFields stage.
Finestre vuote
Quando una finestra non contiene documenti (ad esempio, una range finestra senza valori nell'intervallo), il risultato dipende dall'operatore: $count and $sum return0;$push,,,$addToSet,$firstN, $lastN $minN $maxN$topN, e $bottomN restituisce un array vuoto; $percentile restituisce un array di null valori (uno per percentile richiesto); tutti gli altri operatori restituiscononull.
Esempio (MongoDB Shell)
L'esempio seguente partiziona i documenti in baseregion, ordina ogni partizione in base day e calcola un totale progressivo di revenue dall'inizio della partizione fino al documento corrente.
Create documenti di esempio
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 } ]);
Esempio di interrogazione
db.sales.aggregate([ { $setWindowFields: { partitionBy: "$region", sortBy: { day: 1 }, output: { runningRevenue: { $sum: "$revenue", window: { documents: ["unbounded", "current"] } } } } } ]);
Output
[
{ "_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 }
]
Ogni documento è runningRevenue arricchito dalla somma cumulativa della revenue sua partizione fino al documento corrente incluso.
Esempi di codice
Per visualizzare un esempio di codice per l'utilizzo dello $setWindowFields stage, scegli la scheda corrispondente alla lingua che desideri utilizzare: