map / reduce finalize()并不总是获得相同数量的参数

时间:2011-12-19 19:59:20

标签: mongodb mapreduce

在MongoDb 2.0.1上使用map / reduce时,似乎并不总是使用相同的参数调用finalize方法。

我正在进行常规计数+平均值。

var m = function() {
    emit(this.testName, {
        worked: Number(this.testStatus == "WORKED"),
        failed: Number(this.testStatus == "FAILED"),
        done: Number(this.testStatus == "DONE"),
        count: 1
    });
}

var r = function(key, values) {
    var result = {
        worked: 0,
        failed: 0,
        done: 0,
        count: 0
    }

    values.forEach(function(value) {
      result.worked += value.worked;
      result.failed += value.failed;
      result.done += value.done;
      result.count += value.count;
    });

    return result;
}

var f = function(key, value) {
    data = value || key;
    data.workedMean = data.worked / data.count;
    return data;
}

var cmd = {
    mapreduce: "tests",
    map: m,
    reduce: r,
    finalize: f,
    out: {
        reduce: "fromMongo"
    },
    jsMode: true
}

fromMongo集合为空时,仅使用一个参数value调用f()。当fromMongo已经有值(请注意我使用reduce作为我的out map / reduce参数)时,f()方法会获得两个参数:key和{{1 }}

这是一种已知行为吗? 我管理了两个使用value使其工作,但我不认为这是解决方案。

1 个答案:

答案 0 :(得分:0)

这个问题是由于jsMode和非jsMode之间的最终调用不同(在“reduce”模式的后处理期间发生)。 解决方法是不使用jsMode:true,在这种情况下应始终使用(key,value)调用它。

创建服务器问题: https://jira.mongodb.org/browse/SERVER-4535