View a markdown version of this page

$conjunto WindowFields - Amazon DocumentDB

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 un window documento 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, -1 o2) 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. Una documents ventana requiere un, sortBy a menos que ambos límites lo sean"unbounded".

  • range: especifica la ventana como un rango de valores de sortBy campo relativos al documento actual, en el formulario[ <lowerBound>, <upperBound> ]. Cada límite es un número que se añade al sortBy valor del documento actual o a la "unbounded" palabra clave. Una range ventana requiere exactamente un sortBy campo ascendente y no acepta la "current" palabra clave.

  • unit: opcional. Se usa con range para interpretar los límites numéricos de la ventana como un intervalo de tiempo en el que el sortBy campo contiene valores de fecha. Amazon DocumentDB admite las siguientes unidades:"year","quarter","month",,"week", "day" "hour""minute", "second" y. "millisecond" Cuando unit se especifica, los range lí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:

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = new MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); try { await client.connect(); const db = client.db('test'); const sales = db.collection('sales'); await 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 } ]); const result = await sales.aggregate([ { $setWindowFields: { partitionBy: "$region", sortBy: { day: 1 }, output: { runningRevenue: { $sum: "$revenue", window: { documents: ["unbounded", "current"] } } } } } ]).toArray(); console.log(result); } finally { await client.close(); } } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') try: db = client['test'] sales = db['sales'] sales.insert_many([ { '_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 } ]) result = list(sales.aggregate([ { '$setWindowFields': { 'partitionBy': '$region', 'sortBy': { 'day': 1 }, 'output': { 'runningRevenue': { '$sum': '$revenue', 'window': { 'documents': ['unbounded', 'current'] } } } } } ])) print(result) finally: client.close() example()