分享

求大神看看使用mongo进行mapreduce的reduce数据错误的原因

booleee 发表于 2013-10-17 21:36:45 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 4586
一个最基本的reduce过程,产生的结果和预期完全不一样,在数据相对比较多的时候就不能产生预期结果,是为什么呢?
实际例子:
user结构很简单,就一个uid字段,用于被抛出
function(){
        emit({uid:this.uid},this);
}
redunceFun(key, values) {
     var r={count:0};
         
         for(var i=1;iMapReduce
               

已有(6)人评论

跳转到指定楼层
booleee 发表于 2013-10-17 21:37:27

            

这个是实际进行mapreduce的抛出emit和reduce返回值次数。
        
回复

使用道具 举报

u011235983 发表于 2013-10-17 21:38:10

            试试这个:
mapFunc=function (){ emit({uid:this.uid},1); }
reduceFunc=function (key, values) { return Array.sum(values)}
db.user.mapReduce(mapFunc, reduceFunc, {out:"userResult"} )
        
回复

使用道具 举报

booleee 发表于 2013-10-17 21:38:56

            


执行的结果有变化,但是也是不对的。
        
回复

使用道具 举报

booleee 发表于 2013-10-17 21:39:48

            在http://stackoverflow.com/questions/17871997/reduce-function-on-map-reduce-showing-incorrect-results-why/17877778#17877778找到原因了。原来是每次reduce的时候需要拿到上一次的结果,之前的的代码都丢掉了
        
回复

使用道具 举报

u011235983 发表于 2013-10-17 21:40:31

            结果里的input是2000条纪录,平均没有uid就是400条,看结果应该是对的呀?
能再确认一下你运行的那个collection总共有多少条纪录呢?
引用 3 楼 booleee 的回复:


执行的结果有变化,但是也是不对的。

        
回复

使用道具 举报

pandoraliu 发表于 2013-10-17 21:41:07

            既然叫做uid,就不要有重复的键值。逻辑上不清楚,到最后数据库会受累的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条