MongoDB学习笔记之MapReduce使用示例
一、mapreduce是根据map函数里调用的emit函数的第一个参数来进行分组的
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中所有的记录,将key与value传递给Reduce函数进行处理。Map函数必须调用emit(key,value)返回键值对。
参数说明:
1.map:映射函数(生成键值对序列,作为reduce函数参数)。
2.reduce统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。
3.out统计结果存放集合(不指定则使用临时集合,在客户端断开后自动删除)。
4.query一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
5.sort和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
6.limit发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
//测试数据准备
db.user.drop();
for(vari=10;i<100;i++){
db.user.insert({
name:"user"+i,
age:Math.floor(Math.random()*10)+20,
sex:Math.floor(Math.random()*3)%2==0?'M':'F',
chinese:Math.floor(Math.random()*50)+50,
math:Math.floor(Math.random()*50)+50,
english:Math.floor(Math.random()*50)+50,
class:"C"+i%5
})
}
//runCommand运行方式
db.sales.runCommand({
mapreduce:"user",
map:function(){
if(this.class=="C1"){
emit(this.age,this.age);
}
},
reduce:function(key,values){
varmaxValue=Max(key,values);
returnmaxValue;
},
{
out:{inline:1},
query:"",
sort:"",
limit:"",
}
})
db.user.mapReduce(
//映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。
function(){
//按照emit函数的第一个参数进行分组
//第二个参数的值会传递给reduce
emit(this.age,this);
},
//简化函数,会对map分组后的数据进行分组简化
//在reduce(key,value)中的key就是emit中的key,vlaues为emit分组后的emit(value)的集合
function(key,values){
varmaxValue=Math.max(key,values);
returnmaxValue;
},
//可选参数
{
query:{sex:"F"},
out:"result",
sort:{},
limit:0
}
)
执行结果:
{
"result":"result",//存放的集合名
"timeMillis":23,
"counts":{
"input":29,//传入文档的个数
"emit":29,//此函数被调用的次数
"reduce":6,//此函数被调用的次数
"output":8//最后返回文档的个数
},
"ok":1
}
查看返回的结果:
db.result.find()