2017-06-15 4 views
1

私はmongoDBで文字を何回再生したかをカウントするためにmapreduce関数を書いています。私のJSONから関連する部分は次のようになります。私はすべての「characterIdは」マイドキュメントに持続する回数をカウントする文書内のキーによる総計

"playerInfo": { 
"Player 1": { 
    "info":{ 
      "characterId":17 
     } 
     }, 
"Player 2": { 
     "info":{ 
       "characterId":20 
      } 
     } 
} 

、プレーヤ1からプレイヤーに10人の選手、10

二つがあります質問:
1.キーの一部として数字がある場合、どのようにmongoでmapreduceを使用しますか?
2. mapreduceで文字列をconcatinateすると、下に表示されているコードが正しいことがありますか?

db.LoL.mapReduce(function() 
        { 
         for (var i in this.playerInfo) 
         { 
          emit(this.playerInfo.'Player '+(i).info.characterId, 1); 
         } 

        }, 
        function(keys, values) { 
        return Array.sum(values) 
        }, {out: { merge: "map_reduce_example5" } }) 

ありがとうございました!

+0

質問に答えられていないと思われる回答がありますか?もしそうなら、正確に答えなければならないものを明らかにするために答えにコメントしてください。実際にあなたが質問した質問に答えた場合は、[あなたの回答を受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)に質問してください。聞いてください。 –

答えて

0

だからここ構造と間違って物事のカップルが実際にそこにあり、あなたが本当にそれを変更する「必要がある」

mapReduceあなただけObject.keys()

db.LoL.mapReduce(
    function() { 
    Object.keys(this.playerInfo).forEach(function(key) { 
     emit({ "player": key, "characterId": this.playerInfo[key].info.characterId }, 1) 
    }) 
    }, 
    function(values) { return Array.sum(values) }, 
    { 
    "query": { "playerInfo": { "$exists": true } } 
    "out": { "inline": 1 } 
    } 
) 
経由でキー名を反復処理することができるので非常に簡単です

あなたの代わりに配列を使用するデータ形式を変更し、代わりに名前のキーの値を持つプロパティ場合:

{ 
    "playerInfo": [ 
    { "player": "Player 1", "characterId": 17 }, 
    { "player": "Player 2", "characterId": 20 } 
    ] 
} 

はその後.aggregate()方法ははるかに速く、これを処理であり、かつ大きな結果セットのカーソルを返します。

db.collection.aggregate([ 
    { "$unwind": "$playerInfo" }, 
    { "$group": { 
    "_id": "$playerInfo", 
    "count": { "$sum": 1 } 
    }} 
]) 
のMongoDB 3.4で

と、あなたもあなたの現在の構造に使用することができます大きい

db.LoL.aggregate([ 
    { "$project": { 
    "playerInfo": { "$objectToArray": "$playerInfo" } 
    }}, 
    { "$unwind": "$playerInfo" }, 
    { "$group": { 
    "_id": { 
     "player": "$playerInfo.k", 
     "characterId": "$playerInfo.v.info.characterId" 
    }, 
    "count": { "$sum": 1 } 
    }} 
]) 

基本的にはmapReduceと同じですが、JavaScriptの評価とは対照的にネイティブ演算子が使用されているためにはるかに高速です。