2014-07-23 56 views
0

例子:如何在嵌入式屬性上索引mongodb集合?數據結構

{ 
    "result": { 
     "status": 1, 
     "num_results": 1, 
     "total_results": 500, 
     "results_remaining": 499, 
     "matches": [ 
      { 
       "match_id": 792680045, 
       "match_seq_num": 712015697, 
       "start_time": 1406113521, 
       "lobby_type": 8, 
       "radiant_team_id": 0, 
       "dire_team_id": 0, 
       "players": [ 
        { 
         "account_id": 4294967295, 
         "player_slot": 0, 
         "hero_id": 0 
        }, 
        { 
         "account_id": 137113820, 
         "player_slot": 128, 
         "hero_id": 11 
        } 
       ] 

      } 
     ] 

    } 
} 

這就是數據的很小一部分(原會在名單的10名球員在每場比賽100場比賽和) - 和數據的收入值 - 10張每月數百萬匹配。

這是dota2遊戲比賽的歷史。我想兩個快速搜索類型:

  1. 搜索的匹配PARAMS(match_id,START_TIME和lobby_type)
  2. 搜索按player_id比賽從嵌入式播放數據

我應如何組織它在MongoDB中?

+0

我試圖從你的問題了解一些事情,除了它似乎是要求多個問題(相當廣泛),並且你似乎沒有太多關於MongoDB的知識,即使你看起來似乎在爲一個有利可圖合同。我們應該幫助你獲得報酬,爲什麼? –

+0

你能回答這個問題嗎? – user2572790

+1

哪一個?這太寬泛了。請提出一個簡潔的問題。 –

回答

2

你的數據庫模式似乎很好,可以滿足你提到的兩個查詢。只要創建以下的索引,你應該罰款:

db.collection.ensureIndex({ "result.matches.match_id" : 1 }); 
db.collection.ensureIndex({ "result.matches.start_time" : 1 }); 
db.collection.ensureIndex({ "result.matches.lobby_type" : 1 }); 
db.collection.ensureIndex({ "result.matches.players.account_id" : 1 }); 

當你不只是需要提到的使用情況,但也對球員(像他們的名字)更多信息ACCOUNT_ID,你應避免重複信息在player-subdocument中,所以你不需要隨後查詢你的玩家集合。

但是我擔心可能會影響您的寫入性能:MongoDB不喜歡隨時間推移而增長的文檔。 MongoDB總是試圖將每個文檔保存在數據庫文件的連續部分,以提高讀取性能。但這意味着當文檔更新增加文檔大小時,文檔需要移動到文件的結尾,這是一項昂貴的操作。這意味着當您的文檔以一場比賽開始並且每天接收越來越多時,您的更新性能可能會受到影響。作爲折衷方案,您可以爲比賽創建單獨的集合。

+0

是的,你對比賽的收集是正確的,現在我在關係方案中以同樣的方式保存數據。我有桌子比賽和表players_in_matches。關於mongo我說錯了關於保存數據的問題 - 我真的需要Matches集合,並且在每次獲取部分數據後,我會在最後插入新的匹配項,正如我在問題中所展示的那樣。 – user2572790

相關問題