本文介绍如何使用aggregate方法,对数据库执行聚合查询。
方法定义
aggregate(pipeline: object[], options?: object): Promise<MongoResult>
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
| Array | 是 | 聚合查询管道,该管道允许用户通过一系列基于阶段的操作来处理数据,详情请参考 MongoDB Pipeline。 |
| Object | 否 | 控制项 |
options
结构定义:
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
| Boolean | 否 | 是否在聚合查询执行的过程中使用磁盘存储临时数据,默认取值为 |
| Boolean | 否 | 是否允许绕过文档验证,默认取值为 |
| Object | 否 | 指定更新的排序顺序,具体定义请参考 MongoDB Collation。 |
| Number | 否 | 执行时间(毫秒),默认值:1000,最大值:3000。 |
示例
下面这个示例通过披萨订单表orders
来演示 aggregate pipeline
的用法:
生成演示数据
首先,打开云数据库控制台,新建并选中orders
表,选择高级模式。插入以下演示数据:
db.insertMany( [
{ name: "Pepperoni", size: "small", price: 19,
quantity: 10, date : "2021-03-13T08:14:30.000Z" },
{ name: "Pepperoni", size: "medium", price: 20,
quantity: 20, date : "2021-03-13T09:13:24.000Z" },
{ name: "Pepperoni", size: "large", price: 21,
quantity: 30, date : "2021-03-17T09:22:12.000Z" },
{ name: "Cheese", size: "small", price: 12,
quantity: 15, date : "2021-03-13T11:21:39.000Z" },
{ name: "Cheese", size: "medium", price: 13,
quantity: 50, date : "2022-01-12T21:23:13.000Z" },
{ name: "Cheese", size: "large", price: 14,
quantity: 10, date : "2022-01-12T05:08:13.000Z" },
{ name: "Vegan", size: "small", price: 17,
quantity: 10, date : "2021-01-13T05:08:13.000Z" },
{ name: "Vegan", size: "medium", price: 18,
quantity: 10, date : "2021-01-13T05:10:13.000Z" }
] )
统计总订单数量
统计orders
集合中size
是medium
的订单,并按照披萨name
分组求quantity
字段的和。
db.aggregate( [
// 阶段 1: 筛选披萨尺寸
{
$match: { size: "medium" }
},
// 阶段 2: 对符合条件的订单按照 name 分组并求和 quantity
{
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
}
] )
输出结果:
[
{ _id: 'Cheese', totalQuantity: 50 },
{ _id: 'Vegan', totalQuantity: 10 },
{ _id: 'Pepperoni', totalQuantity: 20 }
]
按日期分组统计订单金额和平均订单数量
db.aggregate( [
// 阶段 1: 筛选日期在 2020-1-30 和 2022-01-30 之间的订单
{
$match:
{
"date": { $gte: "2020-01-30T00:00:00.000Z", $lt: "2022-01-30T00:00:00.000Z" }
}
},
// 阶段 2: 按照日期分组并计算订单金额以及平均订单量
{
$group:
{
_id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageOrderQuantity: { $avg: "$quantity" }
}
},
// 阶段 3: 按照订单金额倒序排列
{
$sort: { totalOrderValue: -1 }
}
] )
输出结果:
[
{ _id: '2022-01-12', totalOrderValue: 790, averageOrderQuantity: 30 },
{ _id: '2021-03-13', totalOrderValue: 770, averageOrderQuantity: 15 },
{ _id: '2021-03-17', totalOrderValue: 630, averageOrderQuantity: 30 },
{ _id: '2021-01-13', totalOrderValue: 350, averageOrderQuantity: 10 }
]
说明
单次请求最多返回文档数量500个。
文档内容是否对您有帮助?