Docs Menu
Docs Home
/ /

$maxN (acumulador de agregación)

$maxN

Nuevo en la versión 5.2.

Devuelve una agregación del valor máximo de n elementos 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 sirve de entrada a $maxN. Se evalúa para cada elemento del grupo y $maxN conserva los valores máximos de n.

  • n limita el número de resultados por grupo y n tiene que ser una expresión integral positiva que sea una constante o dependa del valor _id para $group.

  • $maxN filtra valores nulos y faltantes.

Considere la siguiente agregación que devuelve el máximo de n documentos 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 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.

  • El campo maximumThreeScores se especifica como $maxN con input : "$score" y se devuelve como una matriz.

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

$maxN $topN Los acumuladores y 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 particular es un $topN requisito, utilice.

  • Utilice si no desea ordenar los valores de $topN salida.

Puedes utilizar como $maxN acumulador.

$maxN se admite como 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 se ingresan 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' ] ]
}
]

Puedes usar el acumulador $maxN para encontrar las puntuaciones máximas 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 se ingresan 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 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