初次试用了一下mongodb的mapreduce方法,总结了一些粗浅的认识,记录如下:
下面例子中,document保存的是每次http请求的信息,time域为请求的时间,method域为请求的方法(比如GET,POST)。
map方法:
- 遍历collection中的所有document,按照map方法中定义的规则,对这些document进行分组。
//这里把time域中相同小时的document分到一组
//this为遍历时的某个具体的document
var key = this.time.getHours();
- 根据需求,抽取value值,作为reduce方法的输入。
var value = 0;
//如果method域的内容为GET时,设置value为1,否则为0。
//这里的value是简单的数值类型,也可能是稍微附在的对象。
if(this.method=='GET'){
value = 1;
}
- emit key value,供reduce处理。
emit(key, value);
reduce方法:
相同的key值会传给同一个reduce方法来处理,reduce有2个输入参数:key和values。其中:values为map方法emit出的相同key值对应的value的集合。下面的例子把所有的value值做一个加和处理
reduce = function(key, values){
var sum = 0;
values.forEach(function(value){
sum += value;
});
return sum;
}
上面的的mapreduce就能够计算出collection中,一天中每小时时间段内GET
请求的次数。
具体java代码如下:
String map = String.format("function() {\n" +
" var key = this.time.getHours();\n" +
" var value = 0;\n" +
" if(this.method==\'GET\'){value=1;}\n" +
" emit(key, value);\n" +
"}";
String reduce = "function(key, values){\n" +
" var sum = 0;\n" +
" values.forEach(function(value){\n" +
" sum += value;\n" +
" });\n" +
" return sum;\n" +
"}";
MapReduceResults<ValueObject> results = mongoOperations.mapReduce(
PlatformAccessLog.COLLECTION_NAME, map, reduce, ValueObject.class);
网友评论