Ето как бихте го направили, като използвате 4-етапен тръбопровод за агрегиране
- Сортирайте по държава и по рейтинг, както вече направихте
- Групирайте по държава и вкарайте всички подробности за играчите в масив
- Това е решаващият момент. Използвайте
project
с$arrayElemAt
за да получитеith
оценен играч за всяка от съответните държави -
Използвайте project отново, за да ви даде обекта в желания формат
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" } })
Вижте екранна снимка по-долу за 2nd Highest Rated Players
. Тъй като те са 0-indexed
, iTH_RATING
променливата в заявката се заменя с 1. За да получите играчи с най-висок рейтинг, заменете с 0, така нататък и така нататък.