聚合(Aggregation)
聚合操作处理数据记录并返回计算结果。 聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。 MongoDB提供了三种执行聚合的方法:聚合管道,map-reduce函数和单用途聚合方法。
聚合管道
聚合管道是基于数据处理流水线概念建模的数据聚合框架。 文档进入多阶段管道,将文档转换为聚合结果。聚合管道可以最sharded collection进行操作。管道示例如下图所示:
聚合管道提供了map-reduce的替代方案,并且可能是聚合任务的首选解决方案,其中map-reduce的复杂性可能是无法预估的。
在MongoDB中, aggregate 命令会把整个集合中的文档传入聚合管道。如有需要,可以使用下面的策略来优化这个操作,避免扫描整个集合。
管道操作符合索引
sort管道运算符可以在管道开头出现时利用索引
预先过滤
如果可能,将$ match运算符放在管道的开头。
管道阶段支持的操作: <u>Stage Operator</u>
聚合管道的限制
结果集大小限制:16M
内存限制:100M(allowDiskUse**** option突破内存限制)
聚合管道的优化
http://www.mongoing.com/docs/core/aggregation-pipeline-optimization.html
要查看优化程序如何转换特定聚合管道,请在db.collection.aggregate()方法中包含explain 选项。
预测优化:聚合管道可以检测到是否仅使用文档中的一部分字段就可以完成聚合。如果是的话,管道就可以仅使用这些必要的字段,从而减少进入管道的数据量。、
聚合管道和分片集合
聚合管道支持在 分片 集合执行
http://www.mongoing.com/docs/core/aggregation-pipeline-sharded-collections.html
Map-Reduce
单用途聚合方法
MongoDB提供两种方法:db.collection.count() and db.collection.distinct().
二、运算符(Operators)
2.1、聚合管道运算符
阶段运算符
在db.collection.aggregate方法中,管道阶段组成一个数组, 文档按顺序通过各个阶段。
db.collection.aggregate( [ {< stage> }, ... ] )
三、运算符详细介绍
1、管道聚合运算符
geoNear
定义
输出离指点距离从从近到远的排序文档, geoNear选项的文档, 以与处理文档坐标系相同的单位指定所有距离:
{ $geoNear: { <geoNear options> } }
使用说明
当使用$geoNear的时候,需要考虑以下几点
只能使用$geoNear作为管道的第一个阶段
必须指定distanceField选项。用来在返回的文档中表示距离。
collection必须有空间索引:$geoNear要求集合最多只有一个2d索引和/或只有一个2dsphere索引。
如果使用2dsphere索引,则必须指定spherical:true。
您无需指定文档中的哪个字段包含坐标对或点。 由于geoNear隐式使用索引字段。
示例参考官网