《MongoDB权威指南》学习整理----MongoDB中的聚合

传统的关系型数据库中一般都提供sum/min/max/count/avg五种聚合函数的功能,在这方面MongoDB提供了更为全面的聚合统计函数、方法。

Count

MongoDB中的count和关系型数据库中的count聚合函数的功能一样,都是计算个数,只不过MongDB中计算的是集合中符合条件的文档数量,而关系型数据库中是计算记录的数量。

使用方法:

db.collection.count(queryDoc)

由于返回符合条件的文档数量,最好是没有查询条件,如果有查询条件该count方法的执行时间会变长。

 

distinct

distinct用来找出给定键的所有不同的值,使用时必须指定集合和键。和关系数据库中distinct功能相同。

使用方法:

db.runCommand({'distinct':collectionName,'key':keyName})

都是返回指定集合中的指定键中的不重复的所有值。

 

group

MongoDB中的group和关系型数据库中的group by功能相同,都是分组。但是由于MongoDB是面向文档的,所以在使用的时候比关系型数据库中复杂。

使用方法:

db.collection.group({

'key':{分组依据的keyName:1升序/-1降序},

'initial':{要聚合计算的key:该key的初始值},

'cond':{对要分组的数据的筛选查询文档},

'$reduce':function(当前文档,结果文档){

分组计算方式

},

'finalize':function(结果文档){

对每一个分组的结果文档再次处理的过程,每个结果文档执行一次,类似于SQL中的having

},

'$keyf":function(currentDoc){

分组前,对每一个文档进行的特殊处理。与key参数两者只能有一个

}

})

说明

在MongoDB中,key指定的依据哪个key来分组,同时指定该分组的排序,类似于order by。Initial 参数是MongoDB独有的主要用在reduce函数,代表结果文档中的某个属性的初始值,每个分组使用单独的一个结果文档,一般是关于要计算的某个属性。conf参数类似于group by之前的where条件,即对分组之前过滤。reduce代表每个分组中各个文档的聚合计算方式,可以在这里进行各种分组内容的计算,第一个参数是指当前要计算的文档,第二个参数指最后显示的结果文档。finalize参数的作用主要是为了mongoDB在向客户端传送数据之前再次优化服务端处理结果,类似于SQL中的having子句,但是注意的是每个分组的结果文档只执行一次finalize,即有几个分组那么finalize就执行几次

复杂情况

在一些特殊情况下,我们不只是要对分组中的各个文档进行计算(即分组计算),而且在分组前需要对分组依据的key进行处理(即根据复杂条件分组),例如mongodb要和mongoDB做一个分组,那么我们就需要用到$keyf:function(){}来对集合中的每一个文档进行处理。

而$keyf与key两个参数二者只能同时存在一个。

 

MapReduce

简介

第一次听说MapReduce是在Hadoop中,为实现大数据的并行计算,通过jobnode和tasknode结合来完成hadoop的mapreduce过程。那么MongoDB中的MapReduce会和Hadoop中的MapReduce有什么异同呢。

MongoDB中的MapReduce和Hadoop中一样,都是从map开始,对集合中的文挡进行映射处理,Hadoop中是对HDFS中的文件进行映射处理。map完成之后,MongoDB会按照指明的键进行分组,称为shuffle,而Hadoop中也有此过程。最后就是化简(reduce)过程了,即对各个分组中的数据处理合并。Map-shuffle-reduce过程会反复执行直到得出结果。

MapReduce虽然是并行的计算过程,但是他的速度并不快,所以不适合用于"实时"系统,还是主要作为后台任务来对数据处理,然后将处理结果保存在一个集合中。实时程序对处理结果集合进行查询

应用

db.collection.mapReduce(

mapFunction,

reduceFunction,

{'out':保存计算结果的集合名称,

[finalize:和group一样,都是用来最后处理的,reduce之后,

keeptemp:true/false,是否永久保存out结果集,当设置的out那么keeptemp默认为true,

query:用于在map执行前对文档过滤,

sort:在map前对文档排序一般与limit一起使用,

limit:传入map函数的文档上限,

scope:JS代码中使用的变量,以{key:value}形式,只是作为计算的辅助变量,

verbose:是否产生详尽的服务器日志

}

)

在MongoDB中,mapFunction是用来对collection集合中的每个文档处理的,在mapFunction内部使用this来指代当前处理的文档,mapFunction内部使用emit函数返回下一步reduce函数的输入。Reuduce函数执行处理过的emit函数返回值。out来指定mapredude处理结果的保存位置。

这里的mapReduce处理过程和Hadoop中一样,区别只是MongoDB中map函数每次处理的是集合中的文档,而Hadoop中map每次处理的是HDFS中文档的每条记录。MongoDB中的map流程根据一定的逻辑将集合中所有的文档遍历一遍,处理为:{key:{key1:value1,…}}的形式作为reduce函数的输入。而reduce函数则主要是处理{key1:value1…}这部分的操作。map、reduce中间还有一步shuffle的操作可有可无,就是对{key1:value1,…}排序分组。

mapreduce的计算结果在'out'参数设定的集合中保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值