MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Abfrage, sortieren und dann das n-te Dokument für die Gruppe nehmen

So würden Sie es mit einer 4-stufigen Aggregationspipeline machen

  1. Sortieren Sie nach Ländern und Bewertungen, wie Sie es bereits getan haben
  2. Nach Land gruppieren und alle Spielerdetails in ein Array verschieben
  3. Das hier ist der Knaller. Verwenden Sie project mit $arrayElemAt um den ith zu erhalten bewerteter Spieler für jedes der jeweiligen Länder
  4. 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.