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}}]