Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Operadores de pipeline de agregación

$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 para 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 empataron por el primer elemento. PlayerD se devuelve como el principal score.

  • Para tener un comportamiento de empate más determinista para múltiples valores nulos, añada 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 }
])

Se puede usar 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 }
}
}
}
}
] )

La pipeline de ejemplo:

  • Utiliza $match para filtrar los resultados en un solo gameId. En este caso, G1.

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

  • 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 }
}
}
}
}
] )

La pipeline de ejemplo:

  • Utiliza $group para agrupar los resultados por gameId.

  • Usa $top para devolver los mejores score de 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

$toObjectId

En esta página