W ten sposób można to zrobić za pomocą 4-stopniowego potoku agregacji
- Sortuj według krajów i według ocen, tak jak już to zrobiłeś
- Grupuj według kraju i umieść wszystkie dane gracza w tablicy
- Ten jest kluczem. Użyj
project
z$arrayElemAt
aby uzyskaćith
oceniany gracz dla każdego z odpowiednich krajów -
Użyj projektu ponownie, aby otrzymać obiekt w żądanym formacie
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" } })
Zobacz zrzut ekranu poniżej dla 2nd Highest Rated Players
. Ponieważ są one 0-indexed
, iTH_RATING
zmienna w zapytaniu jest zastępowana przez 1. Aby uzyskać najwyżej ocenianych graczy, zamień na 0, i tak dalej.