mongo之mapReduce

用了这么长时间mongo,才发现居然没有sum、max这样的函数,不过利用mapReduce自己实现也很简单。实现与hadoop的map/reduce很类似。

首先要定义map、reduce函数。进入mongo的shell输入
> var map = function() {
... emit(this.name, {score: this.dic});#设置score虚拟列,将每个collection的score设置为dic的值,用于reduce相加。
... };
> var reduce = function(key, values) {
... var sum = 0;
... for (var i=0;i<values.length;i++){
... sum+=values[i].score;#对每个name的所有score进行相加,得到sum结果。
... }
... return sum;
... };

然后就可以进行查询了:
>db.test3.mapReduce(map, reduce, {out: "test3_result2"});

结果就存贮在了test3_result2表中,可以通过
> db.test3_result2.find()

查询。

补充

上次的mapreduce一直有问题,这次继续学习了一下,终于运行成功了
> map
function (){ emit(1, {"count" : this.num}); }
> reduce
function (key, emits){ total = 0; for(var i in emits){ total += emits[i].count; } return {"count" : total}; }

另外,上面{out: "test3_result2"}会产生一个临时的表格,麻烦,可以将命令改为:

r = db.runCommand({"mapreduce" : "amazon_tmp_list", "map" : map, "reduce" : reduce, "out":{inline:1}})

参考:
http://blog.csdn.net/violet_day/article/details/21458617
http://www.cnblogs.com/yuechaotian/archive/2013/02/21/2920254.html
http://chenzhou123520.iteye.com/blog/1629777

猜你喜欢

转载自onmyway-1985.iteye.com/blog/2065367