OPTIONS
翻译或纠错本页面

聚合简介

聚合 是泛指各种可以处理批量记录并返回计算结果的操作。MongoDB提供了丰富的聚合操作,用于对数据集执行计算操作。在 mongod 实例上执行聚合操作可以大大简化应用的代码,并降低对资源的消耗。

在MongoDB中,像查询之类的聚合操作都是使用 集合 中的文档作为输入,最终的结果会输出一个或者多个文档。

聚合方式

聚合管道

MongoDB 2.2 引入了一种新的基于数据处理管道概念的 聚合框架 。通过一个多阶段的管道,将一组文档转换为最终的聚合结果。

一个管道最基本的功能包含类似于查询的 过滤 功能,和可以修改输出结果的 文档转换 功能

其他的管道即可以根据指定的字段对文档进行排序和分组,也可以对文档内的数组内容或者一个文档数组进行聚合。另外,管道中的任务还可以使用像计算平均值和拼接字符串这样的 操作符

在MongoDB中推荐使用管道来做聚合,是因为管道使用了MongoDB内置的原生操作,聚合效率非常高。

Diagram of the annotated aggregation pipeline operation. The aggregation pipeline has two stages: ``$match`` and ``$group``.

Diagram of the annotated aggregation pipeline operation. The aggregation pipeline has two stages: $match and $group.

映射化简

MongoDB还提供了 映射化简 来做聚合。通常来说,映射化简包含了两个阶段:一个对输入文档逐条处理并 提交 一个或多个对象的 映射 阶段和一个对映射操作的输出做合并的 化简 阶段。映射化简还有一个可选择的 完成 阶段,这个阶段可以对化简阶段的结果做修改。和其他的聚合类似,映射化简可以指定查询条件来选择输入的文档,并可以对输入文档做排序和限定输入个数。

映射化简使用普通的JavaScript函数来执行映射操作、化简操作、和可选的 完成 操作。一般来说,与聚合管道相比,JavaScript函数的优点是灵活,缺点在于效率稍低并且复杂一些。

注解

从MongoDB 2.4开始,某些 mongo 脚本函数和特性已经不能通过映射化简操作来访问了。MongoDB 2.4开始支持同一个时间运行多个JavaScript操作。在MongoDB 2.4以前,JavaScript代码是在单个线程中运行,多线程并发执行映射化简时会出问题。

Diagram of the annotated map-reduce operation.

Diagram of the annotated map-reduce operation.

单一用途的聚合操作

MongoDB提供了一些数据库命令,用于支持一组公共的 单一用途的聚合操作 。这些聚合操作包含:返回匹配到的文档个数、返回某个字段的非重复值列表、对某个字段的数据进行分组。所有的这些操作都是针对单个集合中的文档进行聚合。虽然这些操作可以方便的做一些聚合,但是与聚合管道和映射化简比起来,它们的灵活性和能力要差一些。

Diagram of the annotated distinct operation.

Diagram of the annotated distinct operation.

其他的特点

聚合管道和映射化简都可以运行在 分片集合。映射化简操作还可以输出到一个分片集合中。详情请参考 聚合管道与分片集合映射化简与分片集合

聚合管道在某些阶段中会使用索引来提高执行效率。聚合管道还有内部的优化阶段,详情请参考 聚合管道操作和性能聚合管道优化

要了解聚合管道、映射化简和特殊分组操作的特性差异,请参考 聚合命令对比