View a markdown version of this page

$bucketAuto - Amazon DocumentDB

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

Nouveau depuis la version 8.0.2.

L'étape d'$bucketAutoagré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'groupByexpression, 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'estNaN. Les valeurs valides sont les suivantes : R5 R10 R20 R40R80,1-2-5,E6,E12, E24E48,E96,E192, etPOWERSOF2.

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)

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'granularityoption 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

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