码上敲享录 > mongoDB常见问题解答 > mongoTemplate使用mapReduce统计数据教程

mongoTemplate使用mapReduce统计数据教程

上一章章节目录下一章 2020-12-04已有1886人阅读 评论(0)

mongoTemplate使用mapReduce教程


解决方法:

1.mongoTemplate使用MapReduce统计

     //统计问题 map,我放在resources下

       String map = "classpath:MapReduce.js";

       //问题统计 reduce

       String reduce = "classpath:reduce.js";

       MapReduceResults<HashMap> out = null;

       try {

           out = mongoTemplate.mapReduce("表名", map, reduce, HashMap.class);

       } catch (Exception e) {

           e.printStackTrace();

       }

       Iterator iterator = out.iterator();

       while (iterator.hasNext()) {

           HashMap it = (HashMap) iterator.next();

           String key = (String) it.get("_id");//_id存的是emit中的key,例如tag或者txt

           Map value = (Map) it.get("value"); //返回的数据结构,例如{'123_txt':1,'123_txt':5},值是统计的数值

       }



2.MapReduce.js文件代码,mongo获取每一行都会执行这段代码,this代表当前行的document

function(){

   for(var key in this){

       var obj = {};

       if(key === 'tag'){ //把key为tag的字段筛选出来放到obj对象中,并把值设置为1,方便后面累加统计

           obj[key] = NumberInt(1);

           emit(key,obj);

       }else if(key.indexOf('txt')>0){//把key包含txt的字段筛选出来放到obj中赋值为1,并把obj放到txt组中,这样的话每次调用emit方法时txt组中的键值都对应加1

               obj[key] = NumberInt(1);

               emit('txt',obj);

       }

   }

   //统计总记录数,遍历每一行都会调用emit,相当每次都加1,从而统计总条数

   emit('totalCount',{totalCount : NumberInt(1)});

}



3.emit方法代码

function(key,emits){

   var result = {}

   for(var i in emits){

       var item = emits[i]

       for(var key in item){

           if(result[key]){

               result[key] = NumberInt(result[key]+item[key])

           }else{

               result[key] = NumberInt(item[key])

           }

       }

   }

   return result

}


4.返回的数据结构:

[{'_id':'tag','value':{'tag':5}},{'_id':'txt','value':{'123_txt':5,'456_txt':6}}]



向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交