软件

初试mongodb mapreduce

2017-12-06  本文已影响3人  menglj

初次试用了一下mongodb的mapreduce方法,总结了一些粗浅的认识,记录如下:

下面例子中,document保存的是每次http请求的信息,time域为请求的时间,method域为请求的方法(比如GET,POST)。

map方法:

//这里把time域中相同小时的document分到一组
//this为遍历时的某个具体的document
var key = this.time.getHours();
var value = 0;
//如果method域的内容为GET时,设置value为1,否则为0。
//这里的value是简单的数值类型,也可能是稍微附在的对象。
if(this.method=='GET'){
    value = 1;
}
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);

参考文档

  1. 9.8. Map-Reduce Operations
上一篇 下一篇

猜你喜欢

热点阅读