MongoDB查询,排序然后为组取第n个文档

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)

我希望我的查询返回以下对象:

  • 亚当斯迈克尔
  • 克拉姆尼克弗拉基米尔

(因为这是评价最高的两个)

我希望我的查询也允许我查询第二高评分:

  • McShane Luke J.
  • Grischuk亚历山大

Phi*_*lar 8

这就是使用4阶段聚合管道的方法

  1. 您已经完成了按国家/地区排序和评级
  2. 按国家/地区分组并将所有玩家详细信息推送到阵列中
  3. 这个是关键.使用project$arrayElemAt获得ith额定球员每个各自国家的
  4. 再次使用项目为您提供所需格式的对象

    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,依此类推. 排名第二的球员