View a markdown version of this page

$bucketAuto - Amazon DocumentDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

$bucketAuto

8.0.2 版中的新内容。

Amazon DocumentDB 中的$bucketAuto聚合阶段会根据指定的表达式自动将输入文档分组到指定数量的存储桶中。与明确定义存储分区边界不同$bucket,它$bucketAuto会自动确定边界,以便文档尽可能均匀地分布在请求的存储桶数量上。当您想在不事先知道值的分布的情况下将数据归类为固定数量的组时,这可能很有用。

参数

  • groupBy(必填):指定分组依据的值的表达式。

  • buckets(必填):一个正整数,用于指定将文档分组到的存储桶的数量。根据输入文档和groupBy表达式的不同,存储桶的实际数量可能小于指定的数字。

  • output(可选):一个对象,它指定要为每个存储桶输出的信息。您可以使用诸如$sum、$avg、$min和之类的累加器运算符$max来计算每个存储桶的聚合量。如果省略,则默认情况下,每个存储桶都会输出一个count字段。

  • granularity(可选):一个字符串,它指定用于存储分区边界的首选数字序列。这会将计算出的边界与标准数值序列对齐。仅当所有groupBy值均为数字且都不是数字时,此参数才可用NaN。有效值为:R5、R10、R20、R40R80、1-2-5、E6、E12、E24、E48、E96、E192、和POWERSOF2。

输出

每个存储桶都作为单独的文档返回,其中包含一个描述存储桶边界的_id对象:

  • _id.min:存储桶的内含下限。

  • _id.max: 存储桶的上限。此绑定仅适用于除该系列的最后一个存储桶(其中包含在内)之外的所有存储桶。

示例(MongoDB Shell)

以下示例演示如何使用该$bucketAuto阶段按价格将销售数据分组到存储桶中。

创建示例文档

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

查询示例

以下命令按价格将示例文档分组为三个存储桶:

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

输出

该命令将返回以下输出:

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

粒度查询示例

以下示例添加了将计算出的存储分区边界对齐为 2 的次方的granularity选项。

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

输出

该命令将返回以下输出:

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

代码示例

要查看使用该$bucketAuto命令的代码示例,请选择要使用的语言的选项卡:

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