Aggregation Pipeline

在本页面

聚合管道是一个基于数据处理管道概念建模的数据聚合框架。文档进入多阶段管道,该管道将文档转换成汇总结果。

带 Comments 的聚合管道操作图。聚合管道有两个阶段:$ match 和$ group。

聚合管道提供了map-reduce的替代方案,并且可能是聚合任务的首选解决方案,在这种情况下,map-reduce 的复杂性可能无法保证。

聚合管道对值类型和结果大小有一些限制。有关聚合管道的限制和限制的详细信息,请参见聚合管道限制

Pipeline

MongoDB 聚合管道由stages组成。每个阶段在文档通过管道时都会对其进行转换。流水线阶段不需要为每个 Importing 文档都生成一个输出文档。例如,某些阶段可能会生成新文档或过滤掉文档。管道阶段可以在管道中多次出现。

MongoDB 在mongo Shell 中提供db.collection.aggregate()方法,并在聚合管道中提供aggregate命令。有关可用阶段,请参见聚合管道阶段

例如,使用聚合管道,请考虑用户偏好数据汇总使用邮政编码数据集进行汇总

Pipeline Expressions

一些流水线阶段将流水线表达式作为操作数。管道表达式指定要应用于 Importing 文档的转换。表达式具有document结构,并且可以包含其他expression

管道表达式只能在管道中的当前文档上操作,而不能引用其他文档中的数据:表达式操作提供文档的内存中转换。

通常,表达式是 Stateless 的,只有在聚合过程中看到时才会评估表达式,但有一个 exception:accumulator表达式。

$group阶段中使用的累加器会随着文档在管道中的进行而保持其状态(例如总计,最大值,最小值和相关数据)。

在版本 3.2 中进行了更改:$project阶段提供了一些累加器;但是,在$project阶段使用时,累加器不会跨文档维护其状态。

有关表达式的更多信息,请参见Expressions

聚合管道行为

在 MongoDB 中,aggregate命令在单个集合上运行,将* entire *集合逻辑上传递到聚合管道中。为了尽可能优化操作,请使用以下策略来避免扫描整个集合。

管道运算符和索引

$match$sort管道运算符出现在管道的“开始”处时可以利用索引。

$geoNear管道运算符利用了地理空间索引。使用$geoNear时,$geoNear管道操作必须显示为聚合管道的第一阶段。

在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,索引可以cover聚合管道。在 MongoDB 2.6 和 3.0 中,索引无法涵盖聚合管道,因为即使管道使用索引,聚合仍需要访问实际文档。

Early Filtering

如果您的聚合操作仅需要集合中数据的子集,请使用$match$limit$skip阶段来限制在管道开头 Importing 的文档。当放在管道的开头时,$match操作将使用适当的索引来仅扫描集合中匹配的文档。

从逻辑上讲,在管道的开头放置$match管道阶段,然后放置$sort阶段在逻辑上等效于具有排序的单个查询,并且可以使用索引。如果可能,请将$match运算符放在管道的开头。

Additional Features

聚合管道具有内部优化阶段,可为某些运算符序列提供改进的性能。有关详细信息,请参见聚合管道优化

聚合管道支持对分片集合的操作。参见聚合管道和分片集合