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
/ /

$maxN (operador acumulador)

$maxN

Nuevo en la versión 5.2.

Retorna una agregación de los elementos n con el valor máximo dentro de un grupo. Si el grupo contiene menos de n elementos, $maxN devuelve todos los elementos del grupo.

{
$maxN:
{
input: <expression>,
n: <expression>
}
}
  • input especifica una expresión que es la entrada a $maxN. Se evalúa para cada elemento del grupo y $maxN preserva los valores n máximos.

  • n limita la cantidad de resultados por grupo y n debe ser una expresión numérica positiva que sea constante o dependa del valor de _id para $group.

  • $maxN filtra los valores nulos y ausentes.

Considera la siguiente agregación que devuelve los n documentos máximos de un grupo:

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",
maximumThreeScores:
{
$maxN:
{
input: "$score",
n: 4
}
}
}
}
] )

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.

  • El campo maximumThreeScores se especifica como $maxN con input : "$score" y devuelto como un arreglo.

  • Dado que solo hay 3 documentos con scores, maxN devuelve un máximo de 3 campos score aunque n = 4.

[
{
_id: 'G1',
maximumThreeScores: [ 3, 2, 1 ]
}
]

Tanto los acumuladores $maxN como los $topN pueden lograr resultados similares.

En general:

  • $maxN tiene la ventaja de encontrar valores máximos sin ningún orden de clasificación específico. Si desea conocer los valores máximos de los n documentos,$maxN utilice.

  • Si garantizar un orden de clasificación específico es un requisito, utiliza $topN.

  • Utiliza $topN si no tienes la intención de ordenar los valores de salida.

Puede usar $maxN como un acumulador.

$maxN está soportado como una expresión de agregación.

$maxN se admite window operator como.

Las pipelines de agregación que llaman a $maxN 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 $maxN para encontrar las tres puntuaciones máximas en un solo juego.

db.gamescores.aggregate( [
{
$match : { gameId : "G1" }
},
{
$group:
{
_id: "$gameId",
maxThreeScores:
{
$maxN:
{
input: ["$score","$playerId"],
n:3
}
}
}
}
] )

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 son datos para $maxN con input : ["$score","$playerId"].

  • Utiliza $maxN para devolver los tres elementos de puntuación máximos para el juego G1 con n : 3.

La operación devuelve los siguientes resultados:

[
{
_id: 'G1',
maxThreeScores: [ [ 99, 'PlayerC' ], [ 33, 'PlayerB' ], [ 31, 'PlayerA' ] ]
}
]

Puede usar el acumulador $maxN para encontrar los puntajes máximos de n en cada juego.

db.gamescores.aggregate( [
{
$group:
{
_id: "$gameId",
maxScores:
{
$maxN:
{
input: ["$score","$playerId"],
n: 3
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza $group para agrupar los resultados por gameId.

  • Utiliza $maxN para devolver los tres elementos de puntuación máximos para cada juego con n: 3.

  • Especifica los campos que son datos para $maxN con input: ["$score","$playerId"].

La operación devuelve los siguientes resultados:

[
{
_id: 'G1',
maxScores: [ [ 99, 'PlayerC' ], [ 33, 'PlayerB' ], [ 31, 'PlayerA' ] ]
},
{
_id: 'G2',
maxScores: [ [ 80, 'PlayerD' ], [ 66, 'PlayerC' ], [ 14, 'PlayerB' ] ]
}
]

También puede asignar el valor n dinámicamente. En este ejemplo,$cond se utiliza la expresión en el gameId campo.

db.gamescores.aggregate([
{
$group:
{
_id: {"gameId": "$gameId"},
gamescores:
{
$maxN:
{
input: ["$score","$playerId"],
n: { $cond: { if: {$eq: ["$gameId","G2"] }, then: 1, else: 3 } }
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza $group para agrupar los resultados por gameId.

  • Especifica los campos que se ingresan para $maxN con input : ["$score","$playerId"].

  • Si el gameId es G2 entonces n es 1, de lo contrario n es 3.

La operación devuelve los siguientes resultados:

[
{ _id: { gameId: 'G2' }, gamescores: [ [ 80, 'PlayerD' ] ] },
{
_id: { gameId: 'G1' },
gamescores: [ [ 99, 'PlayerC' ], [ 33, 'PlayerB' ], [ 31, 'PlayerA' ] ]
}
]

Volver

$max

En esta página