Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$top (operador de acumulació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.

Considera la siguiente agregación que devuelve el documento más alto de un grupo de puntuaciones:

  • $top no filtra los valores nulos.

  • $top convierte los valores faltantes en null.

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 por gameId. Este ejemplo tiene solo un gameId, G1.

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

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

  • Especifica 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 es compatible como expresión de agregación.

$top es compatible como un window operator.

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 muestran para $top con output : ["$playerId"," $score"].

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

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

La operación devuelve los siguientes resultados:

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

Puedes usar el acumulador $top para encontrar los mejores 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 muestran para $top con output : ["$playerId", "$score"].

  • Utiliza sortBy: { "score": -1 } para ordenar los puntajes 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