MongoDB中reduce函数的奇怪数值误差

时间:2015-09-15 16:10:04

标签: javascript mongodb mapreduce

我正在尝试使用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

我错过了什么?

1 个答案:

答案 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 }; }