Definição
Retorna o principal elemento de um grupo de acordo com a ordem de classificação especificada.
Observação
Desambiguação
Esta página descreve $top quando usado como um acumulador. Acumuladores retornam um único valor agregado em um grupo de documentos de entrada.
Você também pode usar $top nestes outros contextos:
$top (expression operator), que retorna o primeiro elemento de um array com base em uma ordem de classificação especificada.$top (window function), usado no estágio$setWindowFieldspara retornar o elemento superior de documentos em uma janela específica.
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.
Ordenação de classificação do tipo de dados BSON
Ao classificar diferentes tipos, a ordem dos tipos de dados BSON é usada para determinar a ordem. Como exemplo, considere uma collection cujos valores consistem em strings e números.
Em uma classificação crescente, os valores de string são classificados após valores numéricos.
Em uma classificação decrescente, os valores de string são classificados antes dos valores numéricos.
Neste exemplo:
PlayerAtem uma pontuação inteira.PlayerBtem uma pontuação de string"2".PlayerCtem uma pontuação de string vazia.
Como a ordenação está em ordem decrescente { "score": -1 }, os valores string são ordenados antes da pontuação numérica de PlayerA. $top retorna o primeiro elemento após a ordenação, que é PlayerB:
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: "2" }, { playerId: "PlayerC", gameId: "G1", score: "" } ] }, { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
Exemplos
Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar este conjunto de dados em sua implantação do MongoDB autogerenciado, consulte Carregar o conjunto de dados de amostra. Se você fez alguma modificação nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Encontrar a melhor classificação em um gênero
Você pode usar o acumulador $top para encontrar o filme mais bem avaliado em um gênero.
db.movies.aggregate( [ { $match: { genres: "Comedy", "imdb.rating": { $gt: 0 } } }, { $group: { _id: "Comedy", highestRatedMovie: { $top: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1 } } } } } ] )
O exemplo de pipeline:
Usa
$matchcomo filtro para filmes de comédia com uma classificação IMDb positiva.Usa
$grouppara agrupar todos os filmes de comédia em uma única chave de grupo"Comedy".Especifica os campos que são de saída para
$topcomoutput : ["$title", "$imdb.rating"].Usa
sortBy: { "imdb.rating": -1 }para classificar filmes dentro do grupo por classificação IMDb em ordem decrescente, o que determina o filme que$topretorna.
Encontre a melhor classificação entre múltiplas avaliações
Você pode usar o acumulador $top para encontrar o filme com a melhor classificação para cada categoria de classificação de filme.
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, "imdb.rating": { $gt: 0 } } }, { $group: { _id: "$rated", highestRatedMovie: { $top: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1 } } } } }, { $sort: { _id: 1 } } ] )
O exemplo de pipeline:
Usa
$matchpara filtro filmes nas categoriasG,PG,PG-13eRcom uma classificação IMDb positiva.Utiliza
$grouppara agrupar os resultados porrated.Usa
$toppara retornar o filme mais bem avaliado para cada categoria.Especifica os campos que são de saída para
$topcomoutput : ["$title", "$imdb.rating"].Usa
sortBy: { "imdb.rating": -1 }para classificar filmes dentro de cada grupo por classificação IMDb em ordem decrescente, o que determina o filme que$topretorna.Usa
$sortpara classificar os resultados em ordem alfabética por categoria de classificação.