MongoDB - 如何将这个group()查询转换为map/reduce

3

我有一个集合,每个文档的格式如下

{access_key:'xxxxxxxxx', keyword: "banana", count:12, request_hour:"Thu Sep 30 2010 12:00:00 GMT+0000 (UTC)"}
{access_key:'yyyyyyyyy', keyword: "apple", count:25, request_hour:"Thu Sep 30 2010 12:00:00 GMT+0000 (UTC)", }
.....

为了实现这个目标: SELECT keyword, sum(count) FROM keywords_counter WHERE access_key = 'xxxxxxxxx' GROUP BY keyword 我正在做以下工作:
db.keywords_counter.group({key     : {keyword:true}, 
                          cond    : {access_key: "xxxxx"}, 
                          reduce  : function(obj, prev){prev.total += obj.count},
                          initial : {total:0}})

我该如何使用map/reduce实现相同的功能?[我是一个map/reduce的初学者,正在努力理解这个概念。]

1个回答

4
发现解决方案:
map = function(){ emit(this.keyword, {count: this.count}); }

reduce = function(key, values){
             var total = 0;
             for (var i=0; i < values.length, i++) { total += values[i].count; }
             return {count: total};
         }

db.keywords_counter.mapReduce(map, reduce, {query:{access_key: 'xxxxxxxxx'}})

谢谢,这很有帮助。但我仍在努力,因为我得到了0的计数。 - theTuxRacer
@thetuxracer - 检查emit的第二个参数是否与reduce返回的对象相同。这对我有用。 - rubayeet
我明白了,我之前错误地添加了计数器,而且没有使用值数组。但是你的评论帮助我澄清了另一个问题 :D - theTuxRacer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接