Ecco come lo faresti utilizzando una pipeline di aggregazione a 4 fasi
- Ordina in base al paese e alla valutazione come hai già fatto
- Raggruppa per paese e inserisci tutti i dettagli del giocatore in un array
- Questo è il fattore decisivo. Usa
project
con$arrayElemAt
per ottenere ilith
giocatore valutato per ciascuno dei rispettivi paesi -
Usa di nuovo il progetto per darti l'oggetto nel formato desiderato
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" } })
Vedi la schermata qui sotto per 2nd Highest Rated Players
. Poiché questi sono 0-indexed
, il iTH_RATING
la variabile nella query viene sostituita con 1. Per ottenere i giocatori con il punteggio più alto, sostituire con 0, e così via.