

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

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

Nouveau depuis la version 8.0.2.

L'étape d'`$bucketAuto`agrégation d'Amazon DocumentDB regroupe automatiquement les documents d'entrée dans un nombre spécifié de compartiments en fonction d'une expression spécifiée. Contrairement à `$bucket` la méthode où vous définissez explicitement les limites des compartiments, elle détermine `$bucketAuto` automatiquement les limites afin que les documents soient répartis de manière aussi uniforme que possible sur le nombre de compartiments demandé. Cela peut être utile lorsque vous souhaitez classer les données dans un nombre fixe de groupes sans connaître à l'avance la distribution des valeurs.

**Paramètres**
+ `groupBy`(obligatoire) : expression qui spécifie la valeur à utiliser pour le regroupement.
+ `buckets`(obligatoire) : entier positif qui indique le nombre de compartiments dans lesquels les documents sont regroupés. En fonction des documents d'entrée et de l'`groupBy`expression, le nombre réel de compartiments peut être inférieur au nombre spécifié.
+ `output`(facultatif) : objet qui spécifie les informations à générer pour chaque compartiment. Vous pouvez utiliser des opérateurs d'accumulateur tels que`$sum`, `$avg``$min`, et `$max` pour calculer les agrégations pour chaque compartiment. En cas d'omission, chaque compartiment génère un `count` champ par défaut.
+ `granularity`(facultatif) : chaîne qui spécifie la série de nombres préférée à utiliser pour les limites du compartiment. Cela permet d'adapter les limites calculées à une progression numérique standard. Ce paramètre n'est disponible que si toutes les `groupBy` valeurs sont numériques et aucune d'entre elles ne l'est`NaN`. Les valeurs valides sont les suivantes : `R5` `R10` `R20` `R40``R80`,`1-2-5`,`E6`,`E12`, `E24``E48`,`E96`,`E192`, et`POWERSOF2`.

**Sortie**

Chaque compartiment est renvoyé sous la forme d'un document distinct contenant un `_id` objet décrivant les limites du compartiment :
+ `_id.min`: La limite inférieure incluse du seau.
+ `_id.max`: La limite supérieure du seau. Cette reliure est exclusive pour tous les compartiments, à l'exception du dernier compartiment de la série, où elle est incluse.

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

L'exemple suivant montre comment utiliser le `$bucketAuto` stage pour regrouper les données de vente dans des catégories par prix.

**Créez des exemples de documents **

```
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") }
]);
```

**Exemple de requête **

La commande suivante regroupe les exemples de documents en trois catégories par prix :

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

**Sortie**

La commande renvoie le résultat suivant :

```
[
  { _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 }
]
```

**Exemple de requête avec granularité **

L'exemple suivant ajoute l'`granularity`option permettant d'adapter les limites de compartiment calculées à des puissances de 2.

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

**Sortie**

La commande renvoie le résultat suivant :

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

## Exemples de code
<a name="bucketAuto-code"></a>

Pour afficher un exemple de code d'utilisation de la `$bucketAuto` commande, choisissez l'onglet correspondant à la langue que vous souhaitez utiliser :

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

------