MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requête MongoDB, trier puis prendre le nième document pour le groupe

Voici comment procéder en utilisant un pipeline d'agrégation en 4 étapes

  1. Trier par pays et par note comme vous l'avez déjà fait
  2. Regrouper par pays et regrouper tous les détails des joueurs dans un tableau
  3. Celui-ci est décisif. Utiliser project avec $arrayElemAt pour obtenir le ith joueur classé pour chacun des pays respectifs
  4. Utilisez à nouveau le projet pour vous donner l'objet dans le format souhaité

    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"
            }
    })
    

Voir la capture d'écran ci-dessous pour les 2nd Highest Rated Players . Comme ceux-ci sont 0-indexed , le iTH_RATING variable dans la requête est remplacée par 1. Pour obtenir les joueurs les mieux notés, remplacez-la par 0, ainsi de suite.