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 acumulador. Os acumuladores retornam um único valor agregado em um grupo de documentos de entrada.
Você também pode usar o $top (window function) no estágio $setWindowFields para retornar o elemento superior dos 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 classificação está em { "score": -1 } decrescente, os valores de string são classificados antes da pontuação numérica de PlayerA. $top retorna o primeiro elemento após a classificaçã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 esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Encontre a melhor classificação em um gênero
Você pode usar o acumulador $top para encontrar o filme mais bem avaliado de 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
$matchpara filtrar 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 os filmes dentro do grupo por classificação do IMDb em ordem decrescente, o que determina o filme que$topretorna.
Encontre a melhor classificação em várias classificações
Você pode usar o acumulador $top para encontrar o filme mais bem avaliado para cada categoria de classificação de filmes.
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 filtrar filmes nas categoriasG,PG,PG-13eRcom uma classificação IMDb positiva.Utiliza
$grouppara agrupar os resultados porrated.Usa
$toppara retornar o filme com melhor classificação de cada categoria.Especifica os campos que são de saída para
$topcomoutput : ["$title", "$imdb.rating"].Usa
sortBy: { "imdb.rating": -1 }para classificar os filmes dentro de cada grupo por classificação do IMDb em ordem decrescente, o que determina o filme que$topretorna.Utiliza
$sortpara classificar os resultados alfabeticamente por categoria de classificação.