【问题标题】:Strange numerical errors in reduce function in MongoDBMongoDB中reduce函数中的奇怪数值错误
【发布时间】:2015-09-15 16:10:04
【问题描述】:

我正在 mongo 中尝试使用 map-reduce,但遇到了一个让我完全难过的数值问题。给定以下 map 和 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
        }
    }, 

在顶部代码 sn-p 中取消注释行会给出非常奇怪的输出

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

为什么?

反转注释行以保持 map 和 reduce 命令的对象格式相同(关联?)。 .

//     result.countBy2 = result.count/2
    result.count = result.count/2

仍然给出意外的输出

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

我错过了什么?

【问题讨论】:

  • 你是如何调用函数的?
  • 'db.stuff.mapReduce(map, reduce, { out: { inline: 1 }, scope: { all:tot }, });'
  • “映射器”是问题所在。映射器的“输出”与reducer 作为“输出”本身发出的不同。这是最常见的 mapReduce 错误,因此可能是您的问题。如果您不明白,请显示您的所有代码。
  • 那一行会使你的reduce函数不是幂等的。在此处查看 reduce 函数限制:docs.mongodb.org/manual/reference/command/mapReduce/…
  • "idempotent" 无关,这与这里的问题完全不同,但至少链接基本正确。或者更具体地说:Requirements of the reudce function,这样您就不需要自己滚动浏览了。

标签: javascript mongodb mapreduce


【解决方案1】:

当您的 reduce 函数包含将 count 除以 2 的行时,它违反了您必须遵守的在 docs 中描述的 reduce 函数的幂等性要求:

reduce 函数必须是幂等的。确保以下陈述为真:

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

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

如果您想对 map-reduce 的输出执行最终处理,那么您可以在仅调用一次的选项中包含 finalize 函数。根据您最终要执行的操作,您可能应该将计数除以 2:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多