聚合管道是一个基于数据处理管道概念建模的数据聚合框架。文档进入多阶段管道,该管道将文档转换成汇总结果。例如:
在这个例子中
第一阶段:$match
阶段按status
字段过滤文档,并将status
等于的文档传递到下一阶段"A"
。
第二阶段:该$group
阶段按cust_id
字段将文档分组,以计算每个唯一值的总和cust_id
。
MongoDB聚合管道包括阶段。每个阶段在文档通过管道时都会对其进行转换。流水线阶段不需要为每个输入文档都生成一个输出文档。例如,某些阶段可能会生成新文档或过滤掉文档。
流水线阶段可以与外管道出现多次$out
,$merge
和
$geoNear
阶段。有关所有可用阶段的列表,请参见
聚合管道阶段。
MongoDB db.collection.aggregate()
在mongo
外壳程序中提供了方法,
并提供了aggregate
运行聚合管道的命令。
例如,使用聚合管道时,请考虑 使用“用户偏好数据”进行聚合,以及 使用“邮政编码数据集”进行聚合。
从MongoDB 4.2开始,您可以使用聚合管道在以下位置进行更新:
命令 | mongo 壳方法 |
---|---|
findAndModify |
|
update |
也可以看看
一些流水线阶段将流水线表达式作为操作数。管道表达式指定要应用于输入文档的转换。表达式具有文档 结构,并且可以包含其他表达式。
管道表达式只能对管道中的当前文档进行操作,而不能引用其他文档中的数据:表达式操作提供了文档的内存中转换。
通常,表达式是无状态的,只有在聚合过程中看到时才评估表达式,但有一个例外:累加器表达式。
在$group
阶段中使用的累加器会随着文档在管道中的前进而保持其状态(例如,总计,最大值,最小值和相关数据)。
有关表达式的更多信息,请参见 表达式。
在MongoDB中,该aggregate
命令在单个集合上运行,将整个集合逻辑上传递到聚合管道中。为了尽可能优化操作,请使用以下策略来避免扫描整个集合。
MongoDB的查询计划程序分析聚合管道,以确定是否 可以使用索引来改善管道性能。例如,以下管道阶段可以利用索引:
注意
以下管道阶段并不代表可以使用索引的所有阶段的完整列表。
$match
$match
阶段出现在管道的开始,阶段可以使用索引来过滤文档。$sort
$sort
阶段可以使用索引,只要它不是由前面$project
,$unwind
或
$group
阶段。$group
该$group
阶段有时可以使用的索引来查找每一个组中的第一文档,如果所有的满足下列条件:
有关示例,请参见优化以返回每个组的第一份文档。
$geoNear
$geoNear
管道运营商需要一个地理空间索引的优势。使用时$geoNear
,
$geoNear
管道操作必须出现在聚合管道的第一阶段。在版本3.2中进行了更改:从MongoDB 3.2开始,索引可以覆盖聚合管道。在MongoDB 2.6和3.0中,索引无法覆盖聚合管道,因为即使管道使用索引,聚合仍需要访问实际文档。