$top (acúmulo de agregação)
Nesta página
Definição
Sintaxe
{ $top: { sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } }
Campo | necessidade | Descrição |
---|---|---|
sortBy | Obrigatório | Especifica a ordem dos resultados, com sintaxe semelhante a $sort . |
saída | Obrigatório | Representa a saída de cada elemento no grupo e pode ser qualquer expressão. |
Comportamento
Valores nulos e ausentes
Considere a seguinte agregação que retorna o documento superior de um grupo de pontuações:
$top
não filtra valores nulos.$top
converte valores ausentes em nulo.
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 } } } } } ] )
Neste exemplo:
$documents
cria os documentos literais que contêm as pontuações dos jogadores.$group
agrupa os documentos porgameId
. Este exemplo tem apenas umgameId
,G1
.PlayerD
tem uma pontuação ausente ePlayerE
tem um nuloscore
. Esses valores são considerados nulos.Os campos
playerId
escore
são especificados comooutput : ["$playerId"," $score"]
e retornados como valores de array.Especifique a ordem de classificação com
sortBy: { "score": 1 }
.PlayerD
ePlayerE
empatado para o elemento superior.PlayerD
é retornado como oscore
superior.Para ter um comportamento de quebra de vínculo mais determinístico para vários valores nulos, adicione mais campos ao
sortBy
.
[ { _id: 'G1', playerId: [ 'PlayerD', null ] } ]
Restrições
Suporte para função de janela e expressão de agregação
$top
não é suportado como uma expressão de agregação.
$top
é suportado como um window operator
.
Considerações sobre o limite de memória
Os pipelines de agregação que chamam $top
estão sujeitos ao limite de 100 MB. Se esse limite for excedido para um grupo individual, a agregação falhará com um erro.
Exemplos
Considere uma collection gamescores
com os seguintes 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 } ])
Encontre o melhor Score
Você pode usar o acumulador $top
para encontrar a melhor pontuação em um único jogo.
db.gamescores.aggregate( [ { $match : { gameId : "G1" } }, { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$match
para filtrar os resultados em um únicogameId
. Neste caso,G1
.Utiliza
$group
para agrupar os resultados porgameId
. Neste caso,G1
.Especifica os campos que são de saída para
$top
comoutput : ["$playerId"," $score"]
.Utiliza
sortBy: { "score": -1 }
para classificar as pontuações em ordem decrescente.Usa
$top
para retornar a pontuação máxima do jogo.
A operação retorna os seguintes resultados:
[ { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]
Encontre os Score
principais em vários jogos
Você pode usar o acumulador de $top
para encontrar os score
melhores em cada jogo.
db.gamescores.aggregate( [ { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$group
para agrupar os resultados porgameId
.Usa
$top
para retornar o topscore
de cada jogo.Especifica os campos que são de saída para
$top
comoutput : ["$playerId", "$score"]
.Utiliza
sortBy: { "score": -1 }
para classificar as pontuações em ordem decrescente.
A operação retorna os seguintes resultados:
[ { _id: 'G2', playerId: [ 'PlayerD', 80 ] }, { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]