MongoDB 聚合管道详解

· 约 6 分钟读完

在 MongoDB 中,聚合管道是一种非常强大的数据处理工具,可以用来对集合中的数据进行各种复杂的数据分析和处理。本文将详细介绍 MongoDB 聚合管道的基本概念、语法和常用操作,并提供实例代码用于演示。

基本概念

MongoDB 聚合管道是一个操作符序列,每个操作符都会对输入数据进行一些特定的操作,最终输出一个结果集合。输入数据可以是一个集合中的所有文档,也可以是一个由其他聚合管道操作符生成的数据集合。

MongoDB 提供了多种聚合管道操作符,其中有些操作符仅在特定版本的 MongoDB 中可用。下面是一些常用的聚合管道操作符:

  • $match:对集合中的文档进行筛选,只输出符合条件的文档。
  • $sort:对输入的文档进行排序操作,可以按照一个或多个字段进行排序。
  • $group:按照指定的字段对输入文档进行分组,计算每个分组内的统计数据。
  • $skip:跳过前面指定数量的文档,输出剩余的文档。
  • $limit:指定输出文档的数量限制。
  • $project:对输入文档进行投影操作,只输出指定的字段。

聚合管道语法

MongoDB 聚合管道操作符都是以 $ 开头的字符串,后面跟着具体的操作符名称和参数列表,例如:

上面的语法中,$match、$group 都是聚合管道操作符,{ status: "A" } 和 { _id: "$cust_id", total: { $sum: "$amount" } } 则是具体的操作参数。

常用聚合管道操作

$match

$match 操作符可以用来筛选集合中符合指定条件的文档,语法格式如下:

其中 <query> 是一个 BSON 文件,用来指定文档的筛选条件,例如:

上面的代码会输出集合中所有 status 字段等于 "A" 的文档。

$sort

$sort 操作符可以用来对输入文档进行排序操作,可以按照一个或多个字段进行排序,语法格式如下:

其中 <field> 是按照哪个字段进行排序,<sort_order> 则是排序的方式,可以是 1 表示升序,或 -1 表示降序。例如:

上面的代码会输出按照 age 字段降序排序后的文档。

$group

$group 操作符可以用来按照指定字段对输入文档进行分组,语法格式如下:

其中 _id 是分组字段,<expression> 是一个表达式,用来指定分组的依据。<accumulator> 则是用来计算分组统计数据的函数,例如:

上面的代码会按照 cust_id 字段对输入文档进行分组,并计算每个分组内 amount 字段的总和。

$skip 和 $limit

$skip 和 $limit 操作符可以用来控制输出文档数量,分别用于跳过前面指定数量的文档和输出指定数量的文档,语法格式如下:

其中 <n> 表示需要跳过或输出的文档数量。例如:

上面的代码会跳过集合中前面的 5 个文档,并输出接下来的 10 个文档。

$project

$project 操作符可以用来从输入文档中选择指定的字段进行输出,语法格式如下:

其中 <field> 是输出的字段名,<value> 则是输出的字段值表达式。例如:

上面的代码会从输入文档中选择 _id、name 和 age 三个字段进行输出。

$lookup

$lookup 操作符可以用来从另外一张表中查询数据并与当前表做关联,语法格式如下:

例如:

上面的代码会在 orders 表中查找 cust_id 字段对应的 customers 表中 _id 字段,并将查询结果放在 customer 字段中。

示例代码

下面是一个综合应用了多个聚合管道操作的代码示例:

上面的代码会从 orders 表中查找出 status 字段为 "A" 的订单,并按照 cust_id 分组并计算每个分组的 amount 字段的总和,然后按照 total 字段对分组结果排序,选取前 5 条数据,再从 customers 表中查找出对应的 name 字段并输出。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6361aa941bf7134be6642