聚合管道¶
2.2 新版功能.
聚合管道是一个基于数据处理管道概念的框架。通过使用一个多阶段的管道,将一组文档转换为最终的聚合结果。
聚合管道是映射化简的一个替代方案。而且对于聚合任务来说,聚合管道是一种优选的解决方案,因为映射化简的复杂度可能无法保证。
聚合管道对值的类型和结果大小会有一些限制,详情请参考 聚合管道限制 。
管道¶
MongoDB中的聚合管道由多个 阶段 组成。每个阶段转换各自阶段的输入文档。管道的阶段不一定都要对每个输入文档产生输出文档;比如,有些阶段可能会产生新的文档或者过滤一些文档。同一个阶段也可以在管道中出现多次。
MongoDB还提供了 mongo 命令行下的 db.collection.aggregate() 方法和聚合管道中的 aggregate 具体使用方法请参考 聚合管道操作符指南 。
管道表达式¶
有的管道阶段可以使用管道表达式作为运算符。管道表达式可以对输入文档做指定的转换。管道表达式使用一个 文档 结构体,并且可以包含其他的 表达式 。
管道表达式只可以操作当前管道中的文档,不能访问其他的文档:表达式操作可以在内存中完成对文档的转换。
一般来说,表达式是无状态的,并且仅在聚合过程中处于计算状态,除了 累计操作符 表达式。
使用 $group 操作符的累计操作,需要在管道处理文档的过程中维护自己的状态(例如总数、最大值、最小值和相关数据)。
详情请参考 聚合表达式 。
聚合管道的特点¶
在MongoDB中, aggregate 命令会把*整个*集合中的文档传入聚合管道。如有需要,可以使用下面的策略来优化这个操作,避免扫描整个集合。
管道操作符和索引¶
如果在管道的 开始 阶段使用 $match 和 $sort,这两个操作符会使用索引提高性能。
即使使用了索引,聚合依然需要访问实际存储的文档;比如索引不能满足聚合管道所需要的所有字段的时候。
在 2.6 版更改: 在以前的版本中,对每一个选择用例,一个索引可以贯穿整个管道。