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

标签 mongodb mongodb-query

我正在尝试撰写 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 阶段聚合管道的方式

  1. 按照您已经完成的方式按国家/地区和评分方式进行排序
  2. 按国家分组并将所有玩家详细信息推送到数组中
  3. 这个是关键。使用 project$arrayElemAt 来获得每个国家/地区的 ith<​​ 评级玩家
  4. 再次使用 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,依此类推。 2nd Highest Rated Players

关于MongoDB查询,排序然后将第n个文档作为组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079496/

相关文章:

java - mongo 中的序列 - 可以依赖 findAndModify() 吗?

javascript - Mongoose 使用正则表达式查找不起作用

node.js - 一般搜索 : search between multiple collections (Express/mongoose)

mongodb - 在MongoDB投影中将字符串转换为数字

node.js - findAndModify() 在 Mongoose 中给出异常

MongoDB 游标不返回所有文档

mongodb - 在 upsert 期间使用 $set 和 $setOnInsert

javascript - Mongoose 已连接但找不到数据

node.js - 从 MongoDB 数组中删除原始元素?

javascript - 如何动态构建Mongodb聚合语句?