2013-10-08 4 views
5

mongoシェルのmongodbでmap reduceを実行しようとしています。何らかの理由で、reduceフェーズでは、同じキー(単一のキーではなく)をいくつか呼び出すので、間違った結果が得られます。 私はこのドメインの専門家ではないので、多分私はいくつかばかげた過ちをしています。どんな助けもありがたい。mongodbのmap-reduceで同じキーを使ってReduceを何回か呼び出す

ありがとうございました。 「

var i = 0; 
db.docs.drop(); 
while (i < 10000) { 
    db.docs.insert({text:"line " + i,index:i}); 
    i++; 
} 

その後、私はマップが-削減モジュール10に基づいて(私は各1000を取得する以外にやってる:

私は10000件の文書を作成しています:

これは私の小さな例です

{ 
    "results" : [ 
     { 
      "_id" : 0, 
      "value" : 21 
     }, 
     { 
      "_id" : 1, 
      "value" : 21 
     }, 
     { 
      "_id" : 2, 
      "value" : 21 
     }, 
     { 
      "_id" : 3, 
      "value" : 21 
     }, 
     { 
      "_id" : 4, 
      "value" : 21 
     }, 
     { 
      "_id" : 5, 
      "value" : 21 
     }, 
     { 
      "_id" : 6, 
      "value" : 21 
     }, 
     { 
      "_id" : 7, 
      "value" : 21 
     }, 
     { 
      "_id" : 8, 
      "value" : 21 
     }, 
     { 
      "_id" : 9, 
      "value" : 21 
     } 
    ], 
    "timeMillis" : 76, 
    "counts" : { 
     "input" : 10000, 
     "emit" : 10000, 
     "reduce" : 500, 
     "output" : 10 
    }, 
    "ok" : 1, 
} 

db.docs.mapReduce(
    function() { 
     emit(this.index%10,1); 
    }, 
    function(key,values) { 
     return values.length; 
    }, 
    { 
    out : {inline : 1} 
    } 
); 

しかしバケット」)、結果として、私は次の取得します

答えて

6

マップ/ Reduceは基本的に再帰的な操作です。特に、documented requirements for the reduce function次の文を含める:

MongoDBは、同じキーのために何度もreduce機能の詳細を呼び出すことができます。この場合、そのキーのreduce関数からの以前の出力は、そのキーの次のreduce関数呼び出しの入力値の1つになります。

したがって、入力は以前の呼び出しでカウントされた数値に過ぎないと予想する必要があります。 1が配列を埋めるために使用されるだけで、任意の数は、もはやありませんが、その値が考慮されているので、

db.docs.mapReduce(
    function() { emit(this.index % 10, 1); }, 
    function(key,values) { return Array.sum(values); }, 
    { out : {inline : 1} }); 

今、emit(key, 1)は道でより理にかなって:次のコードは、実際に値を追加することで行います。

これはどれほど危険なのか注意してください。小さなデータセットの場合、エンジンが並列化が必要ないとエンジンが判断したため、誤った結果が得られた可能性があります。

+0

多くのお客様に感謝します。私はドキュメントでこれを逃した。 – eran

+0

ええ、マップ/リダクションはXMLのようです:シンプルに見えますが、どうにかして混乱し、落とし穴がたくさんあります: – mnemosyn

関連する問題