При использовании map / lower на MongoDb 2.0.1 кажется, что метод 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
пуста, f () вызывается только с одним аргументом, value
.Когда fromMongo
уже имеет значения (обратите внимание, что я использую reduce
в качестве моего out
параметра map / Reduce), метод f () получает два аргумента: key
и value
.
Isчто такое известное поведение?Мне удалось два заставить его работать, используя data = value || key;
, но я не думаю, что это решение.