我正在寻找一个符合我需求的数据库,我正在用mongodb进行测试,但我不知道我是否能够做到我想要的。
我的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解析为已定义的表。
答案 0 :(得分: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}])