2011-12-19 38 views
0

在MongoDb 2.0.1上使用map/reduce时,似乎并不总是使用相同的参数调用finalize方法。map/reduce 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()的方法获得两个参数:keyvalue

这是一个已知的行为? 我管理了两个使用data = value || key;工作,但我不认为这是解决方案。

回答

0

这个问题是由于在jsMode和非jsMode(其中“减少”模式的后处理过程中会发生)之间的finalize呼叫的差。 解决方法是不使用jsMode:true,在这种情况下,应始终使用(key,value)调用它。

创建一个服务器的问题: https://jira.mongodb.org/browse/SERVER-4535

+0

嗯,我想这是一个 “解决方案”。谢谢 – Jonas 2011-12-20 22:09:14

相关问题