

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
<a name="setWindowFields"></a>

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 }` `sortBy`La 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
<a name="setWindowFields-bounds"></a>

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` o`2`) 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
<a name="setWindowFields-operators"></a>

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` devuelve`0`;`$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)
<a name="setWindowFields-examples"></a>

En el ejemplo siguiente se dividen los documentos`region`, 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
<a name="setWindowFields-code"></a>

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()
```

------