Definição
Retorna os n valores mínimos dentro de um grupo. Se o grupo tiver menos de n elementos, $minN retornará todos os elementos no grupo.
Observação
Desambiguação
Esta página descreve $minN quando usado como um acumulador. Acumuladores retornam um valor agregado como soma, máximo ou mínimo em um grupo de documentos de entrada.
Você também pode usar $minN nestes outros contextos:
$minN (expression), que retorna osnvalores mínimos em um array.$minN (window function), que é usado no estágio$setWindowFieldspara retornar os valores mínimos dende documentos em uma janela específica.
Sintaxe
{ $minN: { input: <expression>, n: <expression> } }
Campo | Tipo | Descrição |
|---|---|---|
| Expressão | Uma expressão avaliada para cada documento de entrada para determinar os valores de entrada. Os menores |
| Expressão | Determina o número máximo de resultados retornados por grupo. |
Comportamento
Tipo de resultado
Quando $minN compara valores de diferentes tipos, a ordem dos tipos segue a ordem de comparação BSON.
Valores nulos e ausentes
$minN filtra valores nulos e ausentes.
Considere a seguinte agregação que retorna os valores mínimos de n de um 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", minimumThreeScores: { $minN: { input: "$score", n: 4 } } } } ] )
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. Estes valores são ignorados.O campo
minimumThreeScoresé especificado como$minNcominput : "$score"e retornado como um array.Como há apenas 3 documentos com
scores,$minNretorna o mínimo de 3scorecampos, mesmo quen = 4.
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
Comparação de acumuladores de $minN e $bottomN
Ambos $minN e $bottomN acumuladores retornam n valores de um grupo, mas eles diferem na forma como determinam quais valores retornar.
Use
$minNquando os valores que você deseja comparar são os mesmos valores que você deseja retornar.$minNseleciona osnmenores valores comparando as entradas diretamente.Use
$bottomNquando você quiser definir a ordem de classificação separadamente da saída.$bottomNpermite especificar uma chavesortBypara determinar quais documentos são "inferiores" e uma expressãooutputpara controlar quais valores retornar.
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.
Encontre o mínimo de três avaliações para um único gênero
Você pode usar o acumulador $minN para encontrar as três classificações IMDb mais baixas em um único gênero.
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $group: { _id: "Horror", minThreeRatings: { $minN: { input: "$imdb.rating", n: 3 } } } } ] )
O exemplo de pipeline:
Usa
$matchpara filtro os resultados para filmes ondeHorrorestá incluído no arraygenres.Usa
$grouppara agrupar todos os documentos correspondentes em um único grupo.Especifica a entrada para
$minNcominput: "$imdb.rating".Usa
$minNpara retornar as três entradas com a classificação IMDb mais baixa para o gêneroHorrorcomn: 3.
Encontrar as três menores avaliações em vários gêneros
Você pode usar o acumulador $minN para encontrar as n classificações mínimas do IMDb em cada gênero.
db.movies.aggregate( [ { $unwind: "$genres" }, { $group: { _id: "$genres", minThreeRatings: { $minN: { input: "$imdb.rating", n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
O exemplo de pipeline:
Usa
$unwindpara criar um documento separado para cada gênero no arraygenres.Utiliza
$grouppara agrupar os resultados porgenres.Usa
$minNpara retornar as três entradas com a menor classificação IMDb para cada gênero comn: 3.Especifica a entrada para
$minNcominput: "$imdb.rating".Usa
$sortpara classificar os resultados em ordem alfabética por gênero.Limita a saída a cinco documentos para melhorar a legibilidade.
Definir n dinamicamente com base na chave de grupo
Você pode atribuir o valor de n dinamicamente. Neste exemplo, a expressão $cond é usada no campo rated.
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] } } }, { $group: { _id: { "rated": "$rated" }, minMovies: { $minN: { input: "$imdb.rating", n: { $cond: { if: { $eq: [ "$rated", "R" ] }, then: 3, else: 1 } } } } } } ] )
O exemplo de pipeline:
Filtros para filmes com classificações de
G,PG,PG-13ouR.Agrupa filmes por
rated(a classificação indicativa).Especifica a entrada para
$minNcominput: "$imdb.rating".Usa a expressão
$condpara retornar3entradas mínimas para filmes com classificaçãoRe1entrada mínima para todas as outras classificações.
Na saída, a classificação R retorna 3 entradas, enquanto as classificações G, PG e PG-13 retornam 1 entrada cada.