2017-05-07 72 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