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对分组结果汇总。

原文地址:https://www.cnblogs.com/zhangyabin---acm/p/5919540.html