mongodb3的MapReduce命令
db.集合名称.mapReduce(
mapFunction, //必须
reduceFunction, //必须
{
out:"", `字符串 输出结果保存到集合`
query:{}, `文档 map函数前的查询过滤`
sort:{}, `文档 map函数前的排序,其作用是,如果我们在
map之前对key做排序,那么在reduce的过程中,
相同key会在一起,这样可以减少reduce的次数`
limit:3, `整数 map函数输入的最大上限`
finalize:, `方法,reduce得到的结果输入此方法`
scope:{}, `文档 存放全局变量 map reduce finalize方法都能使用`
jsMode:true `是否减少执行过程中BSON和JS的转换 false可以处理大数据mapreduce`
verbose:true `是否产生更加详细的服务器日志`
}
)
如此庞大的命令,看似吓人。其实只有mapFunction和reduceFunction是必须,
简化命令
db.集合名称.mapReduce(map,reduce,{})
mongodb3 循序渐进写MapReduce程序
appuser 集合 具有如下文档
{name:"人间四月",age:20,"locate":" 北京"}
{name:"dolphin",age:22,"locate":" 北京"}
{name:"yunsheng",age:21,"locate":" 天津"}
{name:"shark",age:23,"locate":" 天津"}
{name:"babywang",age:25,"locate":" 四川"}
- 查询各个地区用户年龄的平均值
mapFunction=function(){
emit(this.locate,this);
};
reduce=function(key,emits){
var locate = key;
var total=0;
for(var i=0;i<emits.length;i++){
total=total+emits[i].age;
}
var v = total/emits.length;
return {"locate":locate,"v":v};
};
db.appuser.mapReduce(map,reduce,{out:"mr-result"});
上面程序的说明:
map函数的作用,其实是一个分组映射的过程。函数中 this
指当前正在操作的文档。emit(key,value)
的作用是将文档按照key分组,value输入给reduce的数据。emit(this.locate,this)
的作用便是按照文档的地区分组,并且将整个文档输入给reduce函数。
reduce函数是相同key聚合在一起的过程。function(key,emits)的key就是分组映射的key,emits 是map函数输出的多个value。
out:mr-result 代表reduce的输出结果,存入集合mr-reduce。查看mr-reduce集合,可以得到如下文档
{
"_id" : " 北京",
"value" : {
"locate" : " 北京",
"v" : 21.0
}
}{
"_id" : " 四川",
"value" : {
"_id" : ObjectId("56eac7d58a2558205629602c"),
"name" : "babywang",
"age" : 25.0,
"locate" : " 四川"
}
}{
"_id" : " 天津",
"value" : {
"locate" : " 天津",
"v" : 22.0
}
}
待续