本文介绍如何使用aggregate方法,对数据库执行聚合查询。

方法定义

aggregate(pipeline: object[], options?: object): Promise<MongoResult>

请求参数

字段名

类型

必填

说明

pipeline

Array

聚合查询管道,该管道允许用户通过一系列基于阶段的操作来处理数据,详情请参考 MongoDB Pipeline

options

Object

控制项

options 结构定义:

字段名

类型

必填

说明

allowDiskUse

Boolean

是否在聚合查询执行的过程中使用磁盘存储临时数据,默认取值为false

bypassDocumentValidation

Boolean

是否允许绕过文档验证,默认取值为 false

collation

Object

指定更新的排序顺序,具体定义请参考 MongoDB Collation

maxTimeMS

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集合中sizemedium的订单,并按照披萨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个。