mongodb学习3---mongo的MapReduce
1,概述
MapReduce是个非常灵活和强大的数据聚合工具。它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理。MongoDB也提供了MapReduce,当然查询语肯定是JavaScript。
MongoDB中的MapReduce相当于关系数据库中的group by。使用MapReduce要实现两个函数Map和Reduce函数。Map函数调用emit(key,value),遍历Collection中所有的记录,将key与value传递给Reduce函数进行处理。
2,基本语法
db.runCommand({ mapreduce:<collection>, map:<mapfunction>, reduce:<reducefunction>, [,query:<query filter object>] [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>] [,limit:<number of objects to return from collection>] [,out:<see output options below>] [,keeptemp:<true|false>] [,finalize:<finalizefunction>] [,scope:<object where fields go into javascript global scope>] [,verbose:true] });
参数说明:
Mapreduce:要操作的目标集合
Map:映射函数(生成键值对序列,作为reduce函数参数)
Reduce:统计函数
Query:目标记录过滤
Sort:目标记录排序
Limit:限制目标记录数量
Out:统计结果存放集合(不指定使用临时集合,在客户端断开后自动删除)
Keeptemp:是否保留临时集合
Finalize:最终处理函数(对reduce返回结果进行最终整理后存入结果集合)
Scope:向map、reduce、finalize导入外部变量
Verbose:显示详细的时间统计信息。
3,应用实例
(1)查询active表,每个cid对应的次数。相当于以cid分组。
map=function (){ emit(this.cid,{count:1}) } reduce=function(key,values){ var cnt=0; values.forEach(function(val){ cnt+=val.count;}); return {"count":cnt}; } db.active.mapReduce(map,reduce,{out:'mr1'}) (2)按cid和日期分组 map=function(){ emit({cdi:this.cid,cd:this.cd},{count:1}) } reduce=function(key,values){ var cnt=0; values.forEach(function(val){ cnt+=val.count;}); return {"count":cnt}; } db.active.mapReduce(map,reduce,{out:'mr2'}) (3)每个cid的产品数量,总金额是多少 map=function(){ emit(this.cid,{amount:this.price,count:1}) } reduce=function (key,values){ var res={amount:0,count:0} values.forEach(function(val){ res.amount+=val.amount; res.count+=val.count }); return res; } db.test.mapReduce(map,reduce,{out:"mr3"})
我的总结:在mongodb中,map对集合分组。reduce对分组结果汇总。