View a markdown version of this page

$bucketAuto - Amazon DocumentDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

$bucketAuto

Novo na versão 8.0.2.

O estágio $bucketAuto de agregação no Amazon DocumentDB agrupa automaticamente os documentos de entrada em um número específico de buckets com base em uma expressão especificada. Ao $bucket contrário de quando você define explicitamente os limites do intervalo, determina $bucketAuto automaticamente os limites para que os documentos sejam distribuídos da forma mais uniforme possível pelo número solicitado de compartimentos. Isso pode ser útil quando você deseja categorizar os dados em um número fixo de grupos sem conhecer a distribuição dos valores com antecedência.

Parâmetros

  • groupBy(obrigatório): a expressão que especifica o valor pelo qual agrupar.

  • buckets(obrigatório): um número inteiro positivo que especifica o número de compartimentos nos quais os documentos são agrupados. Dependendo dos documentos de entrada e da groupBy expressão, o número real de compartimentos pode ser menor que o número especificado.

  • output(opcional): um objeto que especifica as informações a serem produzidas para cada bucket. Você pode usar operadores de acumulador como$sum, $avg$min, e $max para calcular agregações para cada bucket. Se omitido, cada bucket gera um count campo por padrão.

  • granularity(opcional): uma string que especifica a série numérica preferida a ser usada para os limites do intervalo. Isso ajusta os limites computados a uma progressão numérica padrão. Esse parâmetro estará disponível somente se todos os groupBy valores forem numéricos e nenhum deles forNaN. Os valores válidos são: R5 R10 R20 R40R80,1-2-5,E6,E12,E24, E48E96,E192,, POWERSOF2 e.

Saída

Cada bucket é retornado como um documento separado que contém um _id objeto descrevendo os limites do bucket:

  • _id.min: O limite inferior inclusivo do balde.

  • _id.max: O limite superior do balde. Esse limite é exclusivo para cada compartimento, exceto o último compartimento da série, onde é inclusivo.

Exemplo (MongoDB Shell)

O exemplo a seguir demonstra como usar o $bucketAuto estágio para agrupar dados de vendas em grupos por preço.

Crie documentos de amostra

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

Exemplo de consulta

O comando a seguir agrupa os documentos de amostra em três grupos por preço:

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

Saída

O comando retorna a seguinte saída:

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

Exemplo de consulta com granularidade

O exemplo a seguir adiciona a granularity opção de ajustar os limites do bucket computado às potências de 2.

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

Saída

O comando retorna a seguinte saída:

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

Exemplos de código

Para ver um exemplo de código para usar o $bucketAuto comando, escolha a guia do idioma que você deseja 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()