Docs Menu
Docs Home
/ /

$top (acumulador de agregación)

$top

Nuevo en la versión 5.2.

Devuelve el elemento principal dentro de un grupo según el orden de acomodo especificado.

{
$top:
{
sortBy: { <field1>: <sort order>, <field2>: <sort order> ... },
output: <expression>
}
}
Campo
Necesidad
Descripción

sortBy

Requerido

Especifica el orden de los resultados, con una sintaxis similar a $sort.

salida

Requerido

Representa la salida de cada elemento del grupo y puede ser cualquier expresión.

Considere la siguiente agregación que devuelve el documento superior de un grupo de puntuaciones:

  • $top no filtra valores nulos.

  • $top Convierte los valores faltantes en nulos.

db.aggregate( [
{
$documents: [
{ playerId: "PlayerA", gameId: "G1", score: 1 },
{ playerId: "PlayerB", gameId: "G1", score: 2 },
{ playerId: "PlayerC", gameId: "G1", score: 3 },
{ playerId: "PlayerD", gameId: "G1"},
{ playerId: "PlayerE", gameId: "G1", score: null }
]
},
{
$group:
{
_id: "$gameId",
playerId:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": 1 }
}
}
}
}
] )

En este ejemplo:

  • $documents crea los documentos literales que contienen las puntuaciones de los jugadores.

  • $group agrupa los documentos gameId por. Este ejemplo solo tiene un,.gameIdG1

  • PlayerD tiene una puntuación faltante y PlayerE tiene un valor nulo score. Ambos valores se consideran nulos.

  • Los campos playerId y score se especifican como output : ["$playerId"," $score"] y se devuelven como valores de matriz.

  • Especifique el orden de clasificación con sortBy: { "score": 1 }.

  • PlayerD y PlayerE empató en el elemento superior. PlayerD se devuelve como el score superior.

  • Para tener un comportamiento de desempate más determinista para múltiples valores nulos, agregue más campos a sortBy.

[
{
_id: 'G1',
playerId: [ 'PlayerD', null ]
}
]

$top no se admite como expresión de agregación.

$top se admite window operator como.

Las pipelines de agregación que llaman a $top están sujetas al límite de 100 MB. Si se supera este límite para un grupo individual, la agregación falla con un error.

Considera una colección gamescores con los siguientes documentos:

db.gamescores.insertMany([
{ playerId: "PlayerA", gameId: "G1", score: 31 },
{ playerId: "PlayerB", gameId: "G1", score: 33 },
{ playerId: "PlayerC", gameId: "G1", score: 99 },
{ playerId: "PlayerD", gameId: "G1", score: 1 },
{ playerId: "PlayerA", gameId: "G2", score: 10 },
{ playerId: "PlayerB", gameId: "G2", score: 14 },
{ playerId: "PlayerC", gameId: "G2", score: 66 },
{ playerId: "PlayerD", gameId: "G2", score: 80 }
])

Puedes utilizar el acumulador $top para encontrar la puntuación más alta en un solo juego.

db.gamescores.aggregate( [
{
$match : { gameId : "G1" }
},
{
$group:
{
_id: "$gameId",
playerId:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza para filtrar los resultados según un $match único.gameId En esteG1 caso,.

  • Usa para agrupar los $group resultados gameId por. En esteG1 caso,.

  • Especifica los campos que se generan para $top con output : ["$playerId"," $score"].

  • Utiliza sortBy: { "score": -1 } para ordenar las puntuaciones en orden descendente.

  • Utiliza $top para devolver la puntuación más alta del juego.

La operación devuelve los siguientes resultados:

[ { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]

Puedes usar el acumulador $top para encontrar el mejor score en cada juego.

db.gamescores.aggregate( [
{
$group:
{ _id: "$gameId", playerId:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza $group para agrupar los resultados por gameId.

  • Utiliza $top para devolver el score superior para cada juego.

  • Especifica los campos que se generan para $top con output : ["$playerId", "$score"].

  • Utiliza sortBy: { "score": -1 } para ordenar las puntuaciones en orden descendente.

La operación devuelve los siguientes resultados:

[
{ _id: 'G2', playerId: [ 'PlayerD', 80 ] },
{ _id: 'G1', playerId: [ 'PlayerC', 99 ] }
]

Volver

$sum

En esta página