2017-06-15 30 views
1

我有一個mapreduce函數,我想在mongoDB中寫入來計算一個角色玩過多少次。相關部分從我的JSON是這樣的:文檔中按鍵的合計總數

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

我想指望每一個「或CharacterId」在我的文檔多少次依然存在,有10名球員,從播放機1選手10

兩個問題:
1.當我有一個數字作爲密鑰的一部分時,如何在mongo中使用mapreduce。
2.我如何在mapreduce中協調字符串,以便顯示較低的代碼可以正確?

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評估速度快得多,速度慢得多。