Así es como lo haría usando una canalización de agregación de 4 etapas
- Ordenar por país y por calificación como ya lo ha hecho
- Agrupe por país y coloque todos los detalles de los jugadores en una matriz
- Este es el factor decisivo. Usar
project
con$arrayElemAt
para obtener elith
jugador calificado para cada uno de los respectivos países -
Use proyecto nuevamente para darle el objeto en el formato deseado
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" } })
Vea la captura de pantalla a continuación para 2nd Highest Rated Players
. Dado que estos son 0-indexed
, el iTH_RATING
la variable en la consulta se reemplaza con 1. Para obtener los jugadores mejor calificados, reemplace con 0, y así sucesivamente.