Mat*_*ebb 8 mongodb mongodb-query
我正在尝试编写一个MongoDB查询...
我的目的是通过country
排序依据检索玩家记录列表,rating
然后仅返回每个国家/地区的第n个评级玩家(因此评分最高,或评分最高等等).
我已经实现了第一部分:
db.getCollection('players').find( { event: 'open' }).sort({ country: 1, rating: -1 });
Run Code Online (Sandbox Code Playgroud)
以下是两个国家的样本,每个国家有三名玩家,按评级排序:
第一队:
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
第二队:
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
我希望我的查询返回以下对象:
(因为这是评价最高的两个)
我希望我的查询也允许我查询第二高评分:
这就是使用4阶段聚合管道的方法
project
与$arrayElemAt
获得ith
额定球员每个各自国家的再次使用项目为您提供所需格式的对象
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"
}
})
Run Code Online (Sandbox Code Playgroud)请参阅下面的屏幕抓取2nd Highest Rated Players
.由于这些是0-indexed
,iTH_RATING
查询中的变量将替换为1.要获得评分最高的玩家替换为0,依此类推.