Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB中reduce函数的奇异数值误差_Javascript_Mongodb_Mapreduce - Fatal编程技术网

Javascript MongoDB中reduce函数的奇异数值误差

Javascript MongoDB中reduce函数的奇异数值误差,javascript,mongodb,mapreduce,Javascript,Mongodb,Mapreduce,我正在mongo试验map reduce,遇到了一个让我完全困惑的数字问题。给定以下映射和reduce函数: var map = function(){ key = "awesome"; emit(key, {count: 1}) } var reduce = function(key, values){ var result = {count: 0}; values.forEach(function(value) { result.co

我正在mongo试验map reduce,遇到了一个让我完全困惑的数字问题。给定以下映射和reduce函数:

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
        }
    }, 
为什么?

反转注释线以保持贴图的对象格式和reduce命令相同(关联?)

仍然提供意外的输出

"results" : [ 
    {
        "_id" : "awesome",
        "value" : {
            "count" : 98.0000000000000000
        }
    }

我缺少什么?

reduce
函数包含将
count
除以2的行时,它违反了reduce函数必须遵守的幂等要求,如中所述:

reduce函数必须是幂等函数。确保以下陈述属实:

reduce(key,[reduce(key,valuesArray)])==reduce(key,valuesArray)

这基本上就是说,您需要能够将一个
reduce
回调的输出作为输入反馈到另一个调用中,并使结果保持不变

如果要对map reduce的输出执行最终处理,则可以在选项中包含一个只调用一次的函数。根据您最终要做的事情,您可能需要将计数除以2:

finalize: function(key, reducedValue) { return { count: reducedValue.count/2 }; }

具体如何调用函数?'db.stuff.mapReduce(map,reduce,{out:{inline:1},scope:{all:tot},});'“地图绘制者”就是问题所在。映射器的“输出”与还原器本身作为“输出”发出的“输出”不同。这是最常见的mapReduce错误,因此也是您可能遇到的问题。如果您不理解,请显示所有代码。该行将使reduce函数不是幂等函数。请参阅此处的reduce函数限制:与此处的问题完全不同,但至少链接基本正确。或者更具体地说:这样你就不需要浏览你自己了。
finalize: function(key, reducedValue) { return { count: reducedValue.count/2 }; }