mongodb聚合管道

聚合管道是Mongodb2.2版本引入的新功能,聚合管道的概念和工作方式类似于linux中的管道操作符。
聚合操作主要用于批量数据处理,往往将记录按条件进行分组,然后在每个组上分别进行一系列操作,聚合操作的输入是集合中的文档,输出可以是一条或者多条文档。
聚合管道由阶段组成,文档在一个阶段处理完毕后,聚合管道会将处理的结果传递给下一阶段,每个阶段有阶段操作符来对文档进行相应的处理,待处理的文档会流经哥哥阶段,最终完成计算,计算的结果可以直接输出也可以存储到集合中

mongodb shell使用db.collection.aggregate([{,…}])来构建和使用聚合管道。

mongodb提供强大的聚合功能,针对聚合操作提供三种方式
1)聚合管道
2)单目的聚合操作
3)MapReduce编程模型

一 聚合管道

例如

如上例如:第一步筛选出status为A的文档
第二步 根据cust_id分组,同时计算每个分组total的总和
第三步 把最后的结果输出到Rresult中。

聚合管道注意的几点:
在每个阶段,对每条输入的文档不一定都有相应的输出
聚合管道中,阶段是可以重复的( out geoNear除外)
聚合管道可以在分片集合上使用
集合管道函数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选项,用来存储计算结果
geoNeargeoNeardistancefield geoNear中是必选的,includeLocs是string类型的,在数据库命令中distanceField是可选的,includeLocs是boolean类型

$redact
这里写图片描述
match首先筛选
redact限制文档显示内容
cond表示条件表达式
PRUNE ,DESCEND表示系统变量
$out
这里写图片描述

输出集合不能是分片集合和固定集合
输出集合不存在时,在管道命令执行完毕时,会自动进行创建
如果输出集合已经存在,会覆盖原集合中的文档

表达式操作符
这里写图片描述

二 聚合管道的使用和优化

默认情况下,整个集合的所有文档做为聚合管道的输入,为了提高数据的处理效率可以使用下面的几个策略:

match sort放于管道开始阶段,这样可以利用集合建立的索引来提高文档的处理效率
提早的过滤在管道的初始阶段,可以使用 match limit , $skip 提早过滤,可以减少流经后续阶段的文档数量

当聚合管道命令执行时,数据库本身也会对各个阶段自动化进行优化,主要包括下面几种情况:
sort+ match顺序优化
如果 match sort后面,优化器会将 match sort前面

skip limit顺序优化
如果 skip limit之后,优化器会将 limit skip的前面,移动后limit的参数值等于原来的值加上skip参数的值

使用聚合管道的限制如下:
内存:聚合管道的每个阶段最多只能占用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值