Mongodb group by json structure里面的元素
问题描述:
我正在寻找一个符合我需求的数据库,我正在用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到定义的表。
答
您可以检查以下内容聚合提供你所需要的:
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}])
哇,它的工作原理。 2查询的作品。非常感谢! – Raxkin