So würden Sie es mit einer 4-stufigen Aggregationspipeline machen
- Sortieren Sie nach Ländern und Bewertungen, wie Sie es bereits getan haben
- Nach Land gruppieren und alle Spielerdetails in ein Array verschieben
- Das hier ist der Knaller. Verwenden Sie
project
mit$arrayElemAt
um denith
zu erhalten bewerteter Spieler für jedes der jeweiligen Länder -
Verwenden Sie erneut project, um das Objekt im gewünschten Format zu erhalten
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" } })
Siehe Screenshot unten für 2nd Highest Rated Players
. Da diese 0-indexed
sind , das iTH_RATING
Variable in der Abfrage wird durch 1 ersetzt. Um die Spieler mit der höchsten Bewertung zu erhalten, ersetzen Sie durch 0 usw.