mongodb聚合管道
聚合管道是Mongodb2.2版本引入的新功能,聚合管道的概念和工作方式类似于linux中的管道操作符。
聚合操作主要用于批量数据处理,往往将记录按条件进行分组,然后在每个组上分别进行一系列操作,聚合操作的输入是集合中的文档,输出可以是一条或者多条文档。
聚合管道由阶段组成,文档在一个阶段处理完毕后,聚合管道会将处理的结果传递给下一阶段,每个阶段有阶段操作符来对文档进行相应的处理,待处理的文档会流经哥哥阶段,最终完成计算,计算的结果可以直接输出也可以存储到集合中
mongodb shell使用db.collection.aggregate([{,…}])来构建和使用聚合管道。
mongodb提供强大的聚合功能,针对聚合操作提供三种方式
1)聚合管道
2)单目的聚合操作
3)MapReduce编程模型
一 聚合管道
如上例如:第一步筛选出status为A的文档
第二步 根据cust_id分组,同时计算每个分组total的总和
第三步 把最后的结果输出到Rresult中。
聚合管道注意的几点:
在每个阶段,对每条输入的文档不一定都有相应的输出
聚合管道中,阶段是可以重复的(
聚合管道可以在分片集合上使用
集合管道函数aggregat只能作用于一个集合
1)聚合管道操作符
a ,阶段操作符(如分组,过滤)
对文档进行过滤筛选符合条件的文档,对文档进行交换,改变文档的输出形式,以下介绍9种
$project
_id:0表示不包括_id这个字段
pageViews:字段的值+10
name字段的值重命名为newName
$mach
score大于70,小于90 的值
或者查看
views大于等于1000的值
在match中不能使用where表达式操作符
如果match位于管道中第一阶段的话,可以借助索引加快查询
match中使用$text操作符时,match只能位于管道的第一阶段
match尽量出现在管道的前面,可以提早过滤文档,减少流经后续阶段的文档数量
$group
必须包括一个_id字段
按author分组,统计publish的总和,并添加一个books的字段
注意
使用group操作符时,默认情况下,分组在内存中执行,最大100MB,如果处理的数据比较大,可以使用allowDiskUse选项,在分组时可以借助磁盘空间,将部分数据交换到磁盘上面,已处理更大的数据量
$sort
对输入的文档进行排序,将文档根据age降序排序,且根据posts的值升序排列
$limit
输出前5条文档
$skip
跳过前5条文档
$unwind
数组字段为空,将会被忽略,该条文档将不会产生任何输出
参数不是一个数组类型时,将会产生一个错误
所作的修改只用于输出,不会改变源文档的内容
$geoNear
地理位置查询
按照由近到远的顺序输出接近某一地理文职的文档
注意
操作符只能位于管道的第一个阶段
使用时必须制定distanceField选项,用来存储计算结果
$redact
match首先筛选
redact限制文档显示内容
cond表示条件表达式
PRUNE ,DESCEND表示系统变量
$out
输出集合不能是分片集合和固定集合
输出集合不存在时,在管道命令执行完毕时,会自动进行创建
如果输出集合已经存在,会覆盖原集合中的文档
表达式操作符
二 聚合管道的使用和优化
默认情况下,整个集合的所有文档做为聚合管道的输入,为了提高数据的处理效率可以使用下面的几个策略:
将
提早的过滤在管道的初始阶段,可以使用
当聚合管道命令执行时,数据库本身也会对各个阶段自动化进行优化,主要包括下面几种情况:
如果
如果
使用聚合管道的限制如下:
内存:聚合管道的每个阶段最多只能占用100MB内存,超过100MB时,会产生错误。如果需要处理大数据,可以使用allowDiskUse选项
单目聚合命令
单目聚合命令,常用的主要有三个:count,distinct,group
于聚合管道相比,单目的操作功能单一,使用简单频繁。
下载数据测试
http://pan.baidu.com/s/1hr7cyI4
导入
mongoimport -d test -c zipcodes –drop zips.json
下载测试脚本
http://pan.baidu.com/s/1hsCcvcw
执行测试js
mongo –quiet mongodb聚合测试.js