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 |
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:
$topnão filtra valores nulos.$topconverte 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:
$documentscria os documentos literais que contêm as pontuações dos jogadores.$groupagrupa os documentos porgameId. Este exemplo tem apenas umgameId,G1.PlayerDtem uma pontuação ausente ePlayerEtem um nuloscore. Esses valores são considerados nulos.Os campos
playerIdescoresão especificados comooutput : ["$playerId"," $score"]e retornados como valores de array.Especifique a ordem de classificação com
sortBy: { "score": 1 }.PlayerDePlayerEempatado para o elemento superior.PlayerDé retornado como oscoresuperior.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
$matchpara filtrar os resultados em um únicogameId. Neste caso,G1.Utiliza
$grouppara agrupar os resultados porgameId. Neste caso,G1.Especifica os campos que são de saída para
$topcomoutput : ["$playerId"," $score"].Utiliza
sortBy: { "score": -1 }para classificar as pontuações em ordem decrescente.Usa
$toppara 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
$grouppara agrupar os resultados porgameId.Usa
$toppara retornar o topscorede cada jogo.Especifica os campos que são de saída para
$topcomoutput : ["$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 ] } ]