MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consulta do MongoDB, classifique e pegue o enésimo documento para o grupo


É assim que você faria usando um pipeline de agregação de 4 estágios
  1. Classifique por país e por classificação, como você já fez
  2. Agrupe por país e coloque todos os detalhes do jogador em uma matriz
  3. Este é o argumento decisivo. Usar project com $arrayElemAt para obter o ith jogador classificado para cada um dos respectivos países

  4. Use o projeto novamente para fornecer o objeto no formato desejado
    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"
            }
    })
    

Veja a captura de tela abaixo para 2nd Highest Rated Players . Uma vez que estes são 0-indexed , o iTH_RATING variável na consulta é substituída por 1. Para obter os jogadores mais bem avaliados, substitua por 0, e assim por diante.