2017-05-07 30 views
0

我正在尋找一個符合我需求的數據庫,我正在用MongoDB進行測試,但我不知道我是否能夠做到這一點,我想要的。Mongodb group by json structure裏面的元素

我有我的MongoDB集合這樣一個JSON文件:

{ 
    "gameId": 1, 
    "gameDuration": 1234, 
    "teams": [{ 
     "teamId": 1, 
     "win": true 
    }, { 
     "teamId": 2, 
     "win": false 
    }], 
    "players": [{ 
     "playerId": 1, 
     "teamId": 1, 
     "age": 32 
    }, { 
     "playerId": 2, 
     "teamId": 2, 
     "age": 52 
    }] 
} 

所以我要的遊戲,像這樣的集合。 我希望能夠查詢玩家最常見的年齡,或者獲得排序的年齡。我不在乎一個球員是否參加了兩場不同的比賽,我只是希望所有比賽中最常見的年齡都與球員和球隊無關。

所以,如果我有4場比賽:

[{ 
     "gameId": 1, 
     "gameDuration": 1234, 
     "teams": [{ 
      "teamId": 1, 
      "win": true 
     }, { 
      "teamId": 2, 
      "win": false 
     }], 
     "players": [{ 
      "playerId": 1, 
      "teamId": 1, 
      "years": 32 
     }, { 
      "playerId": 2, 
      "teamId": 2, 
      "years": 52 
     }] 
    }, 
    { 
     "gameId": 2, 
     "gameDuration": 1234, 
     "teams": [{ 
      "teamId": 1, 
      "win": true 
     }, { 
      "teamId": 2, 
      "win": false 
     }], 
     "players": [{ 
      "playerId": 1, 
      "teamId": 1, 
      "years": 25 
     }, { 
      "playerId": 2, 
      "teamId": 2, 
      "years": 23 
     }] 
    }, 
    { 
     "gameId": 3, 
     "gameDuration": 1234, 
     "teams": [{ 
      "teamId": 1, 
      "win": true 
     }, { 
      "teamId": 2, 
      "win": false 
     }], 
     "players": [{ 
      "playerId": 1, 
      "teamId": 1, 
      "years": 32 
     }, { 
      "playerId": 2, 
      "teamId": 2, 
      "years": 23 
     }] 
    }, 
    { 
     "gameId": 4, 
     "gameDuration": 1234, 
     "teams": [{ 
      "teamId": 1, 
      "win": true 
     }, { 
      "teamId": 2, 
      "win": false 
     }], 
     "players": [{ 
      "playerId": 1, 
      "teamId": 1, 
      "years": 32 
     }, { 
      "playerId": 2, 
      "teamId": 2, 
      "years": 27 
     }] 
    } 
] 

排序年齡的結果應該是:[32, 23, 52, 25, 27]還是最常見的年齡應該在32 否則將被極大地得到各年齡段的計數。 [{"32": 3}, {"23": 2}, {"25": 1}, {"27": 1}]

我有搜索,但無法找到一種方法來執行此查詢。 我不得不說,這個數據庫將有很多遊戲,數百萬,所以我想知道如何做一個查詢會影響性能。我不想要一個200毫秒的查詢,但我也不想要一個1小時的查詢。

我使用mongodb-scala-conector做查詢,但它可以用任何語言,然後我可以嘗試解析我的需要。

我期待其他數據庫做到這一點,但作爲MongoDB讓我直接插入JSON,這是我的第一個選擇。但如果它不符合我的需要,我也尋找Apache Cassandra,如果不適合我會去關係數據庫,解析JSON到定義的表。

回答

1

您可以檢查以下內容聚合提供你所需要的:

db.games.aggregate([{$unwind:"$players"}, {$group:{_id:"$players.years", count:{$sum:1}}}, {$sort:{count:-1}}]) 

或者:

db.games.aggregate([{$unwind:"$players"}, {$group:{_id:"$players.years", count:{$sum:1}}}, {$sort:{count:-1}}, {$limit:1}]) 
+0

哇,它的工作原理。 2查詢的作品。非常感謝! – Raxkin