u010707379 2017-04-14 08:41 采纳率: 0%
浏览 518

MongoDB MapReduce问题

数据库有以下数据
图片说明
然后执行 Map Reduce 函数分别为:
mapFuncation=function(){
emit(this.name,this.age);

};

reduceFunction=function(key,emits){
var reduce={minage:0,maxage:0};

  var maxage=emits[0];
  var minage =emits[0];

  for(var i=0;i<emits.length;i++){
      if(emits[i]>maxage) maxage=emits[i];
      if(emits[i]<minage) minage=emits[i];         
  }
 reduce.minage=minage;
 reduce.maxage=maxage;

 return reduce;

};

db.teacher.mapReduce(mapFuncation,reduceFunction,{out:"agemax"});

执行结果:
图片说明
这个结果是正确的结果,是因为表里面的数据很少,当我把表的数据增加到5000条记录是执行的结果就不正常了。如下图
图片说明
各位高手,请教一下 这个怎么解决

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 17:47
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的MapReduce脚本中,你使用了一个错误的reduce函数定义。你应该将reduce函数设置为一个对象,其中包含两个属性:minagemaxage。这应该被命名为reduce,并且你需要返回这个对象。

    以下是修复后的代码:

    var maxage = emits[0];
    var minage = emits[0];
    
    for (var i = 0; i < emits.length; i++) {
        if (emits[i] > maxage) maxage = emits[i];
        if (emits[i] < minage) minage = emits[i];
    }
    
    reduce.minage = minage;
    reduce.maxage = maxage;
    
    return reduce;
    

    然后,你可以按照以下方式运行MapReduce操作:

    db.teacher.mapReduce(function (key, value) {
        return { key: key, value: value };
    }, function (result) {
        return result.reduce(minage => Math.min(result.minage, minage), result.maxage => Math.max(result.maxage, maxage));
    });
    

    这样,当Map函数返回一个新的映射键值对时,Reduce函数会根据这些新值更新最小年龄和最大年龄变量。

    评论

报告相同问题?