OPTIONS
翻译或纠错本页面

聚合管道

2.2 新版功能.

聚合管道是一个基于数据处理管道概念的框架。通过使用一个多阶段的管道,将一组文档转换为最终的聚合结果。

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中的聚合管道由多个 阶段 组成。每个阶段转换各自阶段的输入文档。管道的阶段不一定都要对每个输入文档产生输出文档;比如,有些阶段可能会产生新的文档或者过滤一些文档。同一个阶段也可以在管道中出现多次。

MongoDB还提供了 mongo 命令行下的 db.collection.aggregate() 方法和聚合管道中的 aggregate 具体使用方法请参考 聚合管道操作符指南

聚合管道的例子,可以参考 聚合用户手册邮编的聚合

管道表达式

有的管道阶段可以使用管道表达式作为运算符。管道表达式可以对输入文档做指定的转换。管道表达式使用一个 文档 结构体,并且可以包含其他的 表达式

管道表达式只可以操作当前管道中的文档,不能访问其他的文档:表达式操作可以在内存中完成对文档的转换。

一般来说,表达式是无状态的,并且仅在聚合过程中处于计算状态,除了 累计操作符 表达式。

使用 $group 操作符的累计操作,需要在管道处理文档的过程中维护自己的状态(例如总数、最大值、最小值和相关数据)。

详情请参考 聚合表达式

聚合管道的特点

在MongoDB中, aggregate 命令会把*整个*集合中的文档传入聚合管道。如有需要,可以使用下面的策略来优化这个操作,避免扫描整个集合。

管道操作符和索引

如果在管道的 开始 阶段使用 $match$sort,这两个操作符会使用索引提高性能。

2.4 新版功能: 管道操作符 $geoNear 会使用地理空间信息索引。当使用 $geoNear 时,一定让要 $geoNear 操作作为聚合管道的第一步来执行。

即使使用了索引,聚合依然需要访问实际存储的文档;比如索引不能满足聚合管道所需要的所有字段的时候。

在 2.6 版更改: 在以前的版本中,对每一个选择用例,一个索引可以贯穿整个管道。

预先过滤

如果你的聚合操作只需要集合中的一部分数据,可以使用 $match , $limit , 和 $skip 等命令来限制输入到管道的文档数量。当在管道操作的一开始就使用 $match ,就可以使用到索引来查询文档了。

在管道的最开始,使用 $match 并随后使用 $sort ,逻辑上和一个排序查询一样,都会使用索引。所以,应当尽可能在管道的最开始使用 $match

其他的特点

聚合管道有一个内部的优化阶段,通过调整操作符的顺序来提高效率。详情请参考 聚合管道的优化

聚合管道操作支持在分片集合上使用。详情请参考 聚合管道和分片集合