Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
$conjunto WindowFields
Nuevo a partir de la versión 8.0.2.
El $setWindowFields escenario de Amazon DocumentDB realiza operaciones en un intervalo específico de documentos (una ventana) de una partición y devuelve los resultados en función del operador de ventana elegido. La etapa agrupa los documentos de entrada en particiones y, si lo desea, los ordena y, para cada documento, calcula uno o más campos de salida en una ventana con los documentos adyacentes.
Sintaxis
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <sortField1>: <sortOrder>, ... }, output: { <outputField1>: { <windowOperator>: <expression>, window: { documents: [ <lowerBound>, <upperBound> ], range: [ <lowerBound>, <upperBound> ], unit: <time unit> } }, ... } } }
Parámetros
-
partitionBy: opcional. Una expresión única que se utiliza para agrupar los documentos en particiones. Puede ser una ruta de campo (por ejemplo,"$state") u otra expresión. Si se omite, todos los documentos de entrada pertenecen a una sola partición. -
sortBy: opcional. Documento que especifica el campo o los campos por los que se ordenan los documentos de cada partición, en orden ascendente o{ <field>: -1 }descendente.{ <field>: 1 }sortByLa A es obligatoria cuando se utilizan límites de ventana basados en documentos o en rangos, y cuando se utiliza uno de los operadores de clasificación. -
output: obligatorio. Un documento que especifica los campos que se van a anexar a cada documento. Puede especificar varios campos de salida, pero cada campo de salida toma exactamente un operador de ventana, su argumento y unwindowdocumento opcional que define los límites de la ventana:{ <field>: { <windowOperator>: <expression>, window: { ... } } }.
Límites de ventana
Dentro de cada output campo, si lo desea, puede definir los límites de las ventanas con un window documento. Una ventana se puede definir por la posición del documento o por un rango de valores.
-
documents: especifica la ventana como un número de documentos antes y después del documento actual, en el formulario[ <lowerBound>, <upperBound> ]. Cada límite es un desplazamiento entero (por ejemplo,-1o2) o una de las palabras clave"unbounded"y"current"."unbounded"extiende la ventana hasta el principio de la partición cuando se usa como límite inferior, o hasta el final de la partición cuando se usa como límite superior."current"significa el documento actual. Unadocumentsventana requiere un,sortBya menos que ambos límites lo sean"unbounded". -
range: especifica la ventana como un rango de valores desortBycampo relativos al documento actual, en el formulario[ <lowerBound>, <upperBound> ]. Cada límite es un número que se añade alsortByvalor del documento actual o a la"unbounded"palabra clave. Unarangeventana requiere exactamente unsortBycampo ascendente y no acepta la"current"palabra clave. -
unit: opcional. Se usa conrangepara interpretar los límites numéricos de la ventana como un intervalo de tiempo en el que elsortBycampo contiene valores de fecha. Amazon DocumentDB admite las siguientes unidades:"year","quarter","month",,"week","day""hour""minute","second"y."millisecond"Cuandounitse especifica, losrangelímites deben ser enteros.
Cuando se omite el window documento, la ventana predeterminada es la que abarca documents: ["unbounded", "unbounded"] toda la partición.
nota
Cuando se utiliza una range ventana en lugar de valores de fecha, se recomienda una duración fija unit "day" (o inferior) en lugar de,, o "month" "quarter""year", cuya longitud depende del calendario puede generar límites de ventana ambiguos.
Operadores de ventanas compatibles
Amazon DocumentDB admite los 26 operadores de ventanas siguientes en el output campo del $setWindowFields escenario:
$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
El $rand operador no es compatible con ningún operador de ventana en $setWindowFields fase.
Ventanas vacías
Cuando una ventana no contiene ningún documento (por ejemplo, una range ventana sin valores en el rango), el resultado depende del operador: $count $sum devuelve0;$push,,,$addToSet, $firstN $lastN $minN $maxN$topN, y devuelve una matriz vacía; $bottomN $percentile devuelve una matriz de null valores (uno por cada percentil solicitado); todos los demás operadores devuelven. null
Ejemplo (MongoDB Shell)
En el ejemplo siguiente se dividen los documentosregion, se ordenan las day particiones y se calcula el total acumulado revenue desde el principio de la partición hasta el documento actual.
Cree documentos de ejemplo
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 } ]);
Ejemplo de consulta
db.sales.aggregate([ { $setWindowFields: { partitionBy: "$region", sortBy: { day: 1 }, output: { runningRevenue: { $sum: "$revenue", window: { documents: ["unbounded", "current"] } } } } } ]);
Salida
[
{ "_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 }
]
Cada documento se complementa con runningRevenue la suma acumulada de revenue dentro de su partición hasta el documento actual, incluido.
Ejemplos de código
Para ver un ejemplo de código sobre el uso del $setWindowFields escenario, elija la pestaña correspondiente al idioma que desee utilizar: