在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
使其工作,但我不认为这是解决方案。
答案 0 :(得分:0)
这个问题是由于jsMode和非jsMode之间的最终调用不同(在“reduce”模式的后处理期间发生)。 解决方法是不使用jsMode:true,在这种情况下应始终使用(key,value)调用它。