我正在尝试撰写 MongoDB查询...
我的目标是按 country
检索按 rating
排序的玩家记录列表,然后返回 only 每个国家/地区的第 n 个评分玩家(所以评价最高,或第三最佳评价等)。
我已经完成了第一部分:
db.getCollection('players').find( { event: 'open' }).sort({ country: 1, rating: -1 });
更新
这是两个国家的样本,每个国家有三名球员,按等级排序:
第一组:
{
"id" : 400041,
"name" : "Adams Michael",
"rating" : 2727,
"country" : "England",
"event" : "open"
},
{
"id" : 404853,
"name" : "McShane Luke J",
"rating" : 2671,
"country" : "England",
"event" : "open",
},
{
"id" : 400025,
"name" : "Short Nigel D",
"rating" : 2666,
"country" : "England",
"event" : "open"
}
二队:
{
"id": 4101588,
"name": "Kramnik Vladimir",
"rating": 2808,
"country": "Russia",
"event": "open"
},
{
"id": 4126025,
"name": "Grischuk Alexander",
"rating": 2784,
"country": "Russia",
"event": "open"
},
{
"id": 14109603,
"name": "Karjakin Sergey",
"rating": 2769,
"country": "Russia",
"event": "open"
}
我希望我的查询返回以下对象:
- 亚当斯·迈克尔
- 克拉姆尼克·弗拉基米尔
(因为这是评分最高的两个)
我希望我的查询也允许我查询第二高评分:
- 麦克肖恩卢克 J
- 格里舒克·亚历山大
最佳答案
这就是使用 4 阶段聚合管道的方式
- 按照您已经完成的方式按国家/地区和评分方式进行排序
- 按国家分组并将所有玩家详细信息推送到数组中
- 这个是关键。使用
project
和$arrayElemAt
来获得每个国家/地区的ith<
评级玩家 再次使用 project 为您提供所需格式的对象
db.getCollection('players').aggregate( { $sort: {country: 1, rating: -1} }, { $group: { _id: "$country", players: {$push: {name: "$name", rating: "$rating", event: "$event"}} } }, { $project: { player: {$arrayElemAt: ["$players", iTH_RATING]} } }, { $project: { name: "$player.name", rating: "$player.rating", event: "$player.event" } })
第二高评分玩家
请参阅下面的屏幕截图。由于这些是 0-indexed
,因此查询中的 iTH_RATING
变量被替换为 1。要获得最高评分的玩家,请替换为 0,依此类推。
关于MongoDB查询,排序然后将第n个文档作为组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079496/