2011-12-19 4 views
0

MongoDb 2.0.1でmap/reduceを使用すると、finalizeメソッドが常に同じ引数で呼び出されるとは限りません。map/reduce finalize()が常に同じ数のパラメータを取得するとは限りません

私は通常のカウント+平均を最後にしています。 fromMongoコレクションが空の場合

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 
} 

、fは()だけで一つの引数、valueと呼ばれています。 fromMongoに既に値がある場合(out map/reduceパラメータとしてreduceを使用していることに注意してください)、f()メソッドには2つの引数:keyvalueがあります。

これは既知の動作ですか? 私はdata = value || key;を使って2つの作業を管理しましたが、これは解決策ではないと私は考えています。

答えて

0

この問題は、jsModeと非jsMode間のファイナライズコールの相違(「reduce」モードの後処理中に発生する)のためです。 回避策は、jsMode:trueを使用しないことです。この場合、常に(key、value)を使用して呼び出す必要があります。サーバーの問題作成者

https://jira.mongodb.org/browse/SERVER-4535

+0

をまあ、私はこれは "ソリューション" であると思います。ありがとう – Jonas

関連する問題