MongoDB 基础系列十七:聚合查询之 Aggregation Pipeline - 综述

前言

此篇博文是 Mongdb 基础系列之一;

本文主要是对 Aggregation Pipeline 进行综合性描述,梳理出“纲”,然后在分别整理相关的“目”;

本文为作者的原创作品,转载需注明出处;

Pipeline

Pipeline 是由一些列的 Pipeline Stages 组成;每一个 Stage 将输入的 documents 进行转换,在 Pipeline 的转换过程中不仅可以对当前的 document 进行过滤、分类等操作,并且还可以生成新的 documents;同一个 Pipeline Stage 可以多次重复出现在同一个 Pipeline 中;

MongoDB 不但为 mongoshell 提供了 db.collection.aggregate() 方法来执行 Pipeline 的相关操作,同时也提供了 aggregate 命令 来执行 Pipeline 的相关工作;

Pipeline Expressions

在 Pipeline 的执行过程当中,有一些 Stages 的执行需要使用 pipeline Expressions( 表达式 )来进一步对输入的 documents 进行转换;

Pipeline expressions 只能作用在当前的 document 上,并且整个转换过程,是在内存中进行的;

通常而言,大多数的 expressions 都是无状态的并且只有在聚合操作过程中引用到该 expressions 的时候才会进行赋值;不过,有一个例外,那就是 accumulator expressions;

Accumulator 操作符,在 $group 的 stage 中被使用到,用来进行 totals, maximuns, minimuns 等相关操作;

相关特性

在 MongoDB 中,Aggregation pipeline 作用在单个 collection 上,逻辑上是将整个 collection 作为参数传递到 pipeline 中;所以,当一个 collection 非常庞大的时候,我们需要对此操作进行优化,如果可能,使用下面的方式来进行优化而避免对整个 collection 进行操作;

使用 Pipeline Operators 和 Indexes

The $match and $sort pipeline operators can take advantage of an index when they occur at the beginning of the pipeline.

New in version 2.4: The $geoNear pipeline operator takes advantage of a geospatial index. When using $geoNear, the $geoNear pipeline operation must appear as the first stage in an aggregation pipeline.

Changed in version 3.2: Starting in MongoDB 3.2, indexes can cover an aggregation pipeline. In MongoDB 2.6 and 3.0, indexes could not cover an aggregation pipeline since even when the pipeline uses an index, aggregation still requires access to the actual documents.

上述所指的 cover 指的是 cover query

Early Filtering

If your aggregation operation requires only a subset of the data in a collection, use the $match, $limit, and $skip stages to restrict the documents that enter at the beginning of the pipeline. When placed at the beginning of a pipeline, $match operations use suitable indexes to scan only the matching documents in a collection.

如果你只需要使用 collection 中的一部分数据进行 Pipeline 的操作,尽早的使用 $match, $limit$skip stages 来对 collection 中的 documents 进行筛选;当 $match 被放置在整个 pipeline 的最开始部分的时候,它将会使用合适的 indexes 来检索 collection 中的文档;

毫无疑问,官文是强烈的推荐将 $match 操作符放置在 pipeline 的开始的位置;

Additional Features

有一些 internal 优化措施,可以参考 Aggregation Pipeline Optimization

总结 - 整理出现相关的“目”

所以,根据 Aggregation Pipeline 的相关简介的内容,我们可以梳理出如下的”目”

下面,笔者将会按照上述的逻辑来依次对 Aggregation Pipeline 进行详细的深入的分析;

References

SQL Left join: http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html
SQL Group by: http://www.cnblogs.com/lovemewoxjm/archive/2013/01/06/group_by.html