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.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.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.iyunv.com/blog/1629777
页:
[1]