如何使用计算值批量更新MongoDB中服务器上的文档?

时间:2011-05-16 15:39:55

标签: mongodb set mapreduce

我有一系列的东西,每个东西都有一些用户评论,每个评论有一个数字(1-5)评级。我想定期运行一个批处理作业,根据该用户评论中的个人评分计算每个“事物”的平均评分,然后再用该新评级保存“事物”。我希望在服务器上实现这一点,而无需下载和上传每个文档。

换句话说,我正在寻找一个解决方案,它将迭代我的收藏中的所有内容,从用户评论中总结评级,然后将该总和除以评级计数(从而获得平均值)并将该平均值存储在每个文件的属性。

我尝试先使用map / reduce来解决这个问题,例如:

function () {
    var rating = 0;
    for (var i = 0; i < this.Reviews.length; i++) {
        rating += this.Reviews[i].Rating;
    }
    rating = rating / this.Reviews.length;
    emit(this._id, rating);
}

function(key, values) {
    return null;
}

评级似乎计算得当,但我无法在第一个或第二个函数中调用db.things.update()。我 能够使用结果表更新评级,如下所示:

db.reduced.find().forEach(function(thing) {
  db.things.update({_id: thing._id},{$set:{Rating:thing.value}});
});

但这是一个客户端解决方案并不令人满意......它不一定是map / reduce,但可能是要走的路?

1 个答案:

答案 0 :(得分:1)

使用db.eval(your_JS_code_here)。