

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.

# $bucketAuto
<a name="bucketAuto"></a>

Nuevo a partir de la versión 8.0.2.

La fase de `$bucketAuto` agregación de Amazon DocumentDB agrupa automáticamente los documentos de entrada en un número específico de cubos en función de una expresión específica. A diferencia `$bucket` de lo que ocurre cuando se definen los límites de los cubos de forma explícita, los determina `$bucketAuto` automáticamente para que los documentos se distribuyan de la forma más uniforme posible en el número de cubos solicitado. Esto puede resultar útil cuando desea clasificar los datos en un número fijo de grupos sin conocer de antemano la distribución de los valores.

**Parámetros**
+ `groupBy`(obligatorio): expresión que especifica el valor por el que se va a agrupar.
+ `buckets`(obligatorio): un entero positivo que especifica el número de cubos en los que se agrupan los documentos. En función de los documentos de entrada y de la `groupBy` expresión, el número real de cubos puede ser inferior al número especificado.
+ `output`(opcional): objeto que especifica la información que se generará para cada bucket. Puedes usar operadores acumuladores como`$sum`, `$avg``$min`, y `$max` para calcular las agregaciones de cada depósito. Si se omite, cada bucket genera un `count` campo de forma predeterminada.
+ `granularity`(opcional): cadena que especifica la serie numérica que se prefiere usar para los límites del bucket. Esto ajusta los límites calculados a una progresión numérica estándar. Este parámetro solo está disponible si todos los `groupBy` valores son numéricos y ninguno de ellos lo es. `NaN` Los valores válidos son: `R5``R10`,`R20`,`R40`,`R80`,`1-2-5`,`E6`,`E12`,`E24`,`E48`, `E96``E192`, y`POWERSOF2`.

**Salida**

Cada bucket se devuelve como un documento independiente que contiene un `_id` objeto que describe los límites del bucket:
+ `_id.min`: El límite inferior inclusivo del bucket.
+ `_id.max`: El límite superior del cubo. Este límite es exclusivo para todos los cubos, excepto para el último segmento de la serie, en el que es inclusivo.

## Ejemplo (MongoDB Shell)
<a name="bucketAuto-examples"></a>

El siguiente ejemplo muestra cómo usar el `$bucketAuto` escenario para agrupar los datos de ventas en grupos por precio.

**Cree documentos de muestra **

```
db.sales.insertMany([
  { item: "abc", price: 10, quantity: 2, date: new Date("2020-09-01") },
  { item: "def", price: 20, quantity: 1, date: new Date("2020-10-01") },
  { item: "ghi", price: 5, quantity: 3, date: new Date("2020-11-01") },
  { item: "jkl", price: 15, quantity: 2, date: new Date("2020-12-01") },
  { item: "mno", price: 25, quantity: 1, date: new Date("2021-01-01") }
]);
```

**Ejemplo de consulta **

El siguiente comando agrupa los documentos de muestra en tres grupos por precio:

```
db.sales.aggregate([
  {
    $bucketAuto: {
      groupBy: "$price",
      buckets: 3,
      output: {
        "count": { $sum: 1 },
        "totalQuantity": { $sum: "$quantity" }
      }
    }
  }
])
```

**Salida**

El comando devuelve el siguiente resultado:

```
[
  { _id: { min: 5, max: 15 }, count: 2, totalQuantity: 5 },
  { _id: { min: 15, max: 25 }, count: 2, totalQuantity: 3 },
  { _id: { min: 25, max: 25 }, count: 1, totalQuantity: 1 }
]
```

**Ejemplo de consulta con granularidad **

El siguiente ejemplo agrega la `granularity` opción de ajustar los límites calculados del bucket a potencias de 2.

```
db.sales.aggregate([
  {
    $bucketAuto: {
      groupBy: "$price",
      buckets: 2,
      granularity: "POWERSOF2",
      output: {
        "count": { $sum: 1 },
        "totalQuantity": { $sum: "$quantity" }
      }
    }
  }
])
```

**Salida**

El comando devuelve el siguiente resultado:

```
[
  { _id: { min: 4, max: 16 }, count: 3, totalQuantity: 7 },
  { _id: { min: 16, max: 32 }, count: 2, totalQuantity: 2 }
]
```

## Ejemplos de código
<a name="bucketAuto-code"></a>

Para ver un ejemplo de código sobre el uso del `$bucketAuto` comando, elige la pestaña del idioma que deseas usar:

------
#### [ Node.js ]

```
const { MongoClient } = require('mongodb');

async function example() {
  const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false');
  const db = client.db('test');
  const sales = db.collection('sales');

  const result = await sales.aggregate([
    {
      $bucketAuto: {
        groupBy: "$price",
        buckets: 3,
        output: {
          "count": { $sum: 1 },
          "totalQuantity": { $sum: "$quantity" }
        }
      }
    }
  ]).toArray();

  console.log(result);
  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')
    db = client['test']
    sales = db['sales']

    result = list(sales.aggregate([
        {
            '$bucketAuto': {
                'groupBy': '$price',
                'buckets': 3,
                'output': {
                    'count': {'$sum': 1},
                    'totalQuantity': {'$sum': '$quantity'}
                }
            }
        }
    ]))

    print(result)
    client.close()

example()
```

------