mongodb3 聚合之MapReduce

2016-03-23  本文已影响0人  dolphin叔叔

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":" 四川"}
  1. 查询各个地区用户年龄的平均值
 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
    }
}

待续

上一篇下一篇

猜你喜欢

热点阅读