Aggregation > Aggregation Concepts > Aggregation Pipeline

来源:互联网 发布:山东滨州大数据产业园 编辑:程序博客网 时间:2024/05/17 13:41

聚合管道


聚合管道是一种模拟数据处理管道的聚合框架。文档进入聚合管道进而输出所需的结果文档。

聚合管道提供一种相对MapReduce简单的选择,在处理不需要复杂分析逻辑的场景下比较适用。

Diagram of the annotated aggregation pipeline operation. The aggregation pipeline has two phases: ``$match`` and ``$group``.
带有$match和&group注解的聚合管理框图

聚合管道在值类型和结果集大小上存在限制。(具体约束翻译文档待续翻译)

管道


从概念上讲,集合中的文档在穿过管道过程中进行转换。与Unit中的管道命令在概念上是类似的。

MongoDB的聚合管道通过流的方式处理集合中的文档。文档在传输过程中被管道中的操作进行处理。管道操作不需要在每一步操作后产生结果文档,并且管道操作可以重复执行。

2.6版本中的MongoDB中,db.collection.aggretate()可以产生任意大小的集合。之前的版本只能生成最大为16M的集合。

管道表达式


每个管道操作都需要一个管道表达式来做为操作数。管道表达式用于指定应用于输入文档的转换操作。管道表达式包含字段、值、操作符。

管道表达式只能处理在管道中的当前数据:表达式提供了一种内存式的处理。

一般来说,管道操作是无状态的并且只能计算被管道表达式看到时的数据,除了一个例外:累计表达式。累计表达式使用$group操作符管理通过管道的数据的状态。

聚合管道行为


在MongoDB中,聚合命令在一个集合上进行操作,逻辑上将整个集合传递到聚合管道中。为了优化聚合操作,在任何可能的机会使用如下的策略来避免扫面整个集合。

管道操作和索引


在管道操作的开始处可以使用$match和$sort,进而利用到集合索引。

在MongoDB2.4版本中,新增$geoNear操作可以利用地理空间索引。当使用$geoNear操作时,必须在管道操作的第一阶段使用。

在MongoDB2.6版本中的修改:在之前的版本中,对于选择的用例,索引可以覆盖整个管道。

提前过滤


如果在你的聚合操作中只需要集合的部分数据,可以在管道开始处使用$limit、$match、$skip对集合数据进行过滤。在集合的开始处使用$match可以使用合适的索引过滤符合要求的文档。

在管道操作$match的后边跟随$sort,在逻辑上等同于查询之后进行排序,可以利用索引。一旦有可能,在管道开始处使用$match。

提前过滤


在聚合管道中存在自有的内部优化可以提高一系列聚合操作的性能。(详情见后续翻译)

分区节点中支持聚合操作。(详情见后续翻译)

0 0
原创粉丝点击