sql >> Base de Datos >  >> NoSQL >> MongoDB

Consulta de MongoDB, ordene y luego tome el documento n para el grupo

Así es como lo haría usando una canalización de agregación de 4 etapas

  1. Ordenar por país y por calificación como ya lo ha hecho
  2. Agrupe por país y coloque todos los detalles de los jugadores en una matriz
  3. Este es el factor decisivo. Usar project con $arrayElemAt para obtener el ith jugador calificado para cada uno de los respectivos países
  4. Use proyecto nuevamente para darle el objeto en el formato deseado

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

Vea la captura de pantalla a continuación para 2nd Highest Rated Players . Dado que estos son 0-indexed , el iTH_RATING la variable en la consulta se reemplaza con 1. Para obtener los jugadores mejor calificados, reemplace con 0, y así sucesivamente.