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