您的位置:首页 > 数据库 > Mongodb

mongodb聚合管道

2017-09-29 09:26 351 查看
聚合管道是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选项,用来存储计算结果

geoNear和数据库命令geoNear相似,不同之处在于distancefield在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 文档 数据