我正在尝试使用mongo中的map-reduce,并遇到了一个让我完全陷入困境的数字问题。给出以下map和reduce函数:
var model = db.Authours.Find(author.ID)
//update the values or use something like Automapper
db.SaveChanges()
给出逻辑
var map = function(){
key = "awesome";
emit(key, {count: 1})
}
var reduce = function(key, values){
var result = {count: 0};
values.forEach(function(value) {
result.count += value.count;
});
result.countBy2 = result.count/2
// result.count = result.count/2
return result
}
顶部代码段中的取消注释行给出了非常好奇的输出
"results" : [
{
"_id" : "awesome",
"value" : {
"value" : {
"count" : 7696.0000000000000000,
"countBy2" : 3848.0000000000000000
}
},
为什么?
撤消注释行以保持地图的对象格式并减少命令相同(关联?)。 。
"results" : [
{
"_id" : "awesome",
"value" : {
"count" : 98.0000000000000000,
"countBy2" : 98.0000000000000000
}
},
仍然提供意外的输出
// result.countBy2 = result.count/2
result.count = result.count/2
我错过了什么?
答案 0 :(得分:2)
当您的reduce
函数包含将count
除以2的行时,它违反了docs中所述的减少函数必须遵守的幂等要求:
reduce函数必须幂等。确保以下陈述为真:
reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )
这基本上说你需要能够将一个reduce
回调的输出作为输入反馈给另一个呼叫,并使结果保持不变。
如果要对map-reduce的输出执行最终处理,则可以在仅调用一次的选项中包含finalize函数。根据您最终要做的事情,您可能会将您的点数除以2:
finalize: function(key, reducedValue) { return { count: reducedValue.count/2 }; }