Definição
Retorna uma agregação dos primeiros n elementos em um grupo. Os resultados serão significativos somente se os dados de entrada para o estágio de agrupamento tiverem uma ordem de classificação definida. Se o grupo tiver menos de n elementos, $firstN retornará todos os elementos no grupo.
O acumulador $firstN está disponÃvel nos seguintes estágios:
Observação
Desambiguação
Esta página descreve $firstN quando usado como acumulador. Os acumuladores retornam um único valor agregado como soma, máximo ou mÃnimo em um grupo de documentos de entrada.
Você também pode usar $firstN nestes outros contextos:
$firstN (expression), que retorna o número especificado de elementos desde o inÃcio de uma array.$firstN (window function), que é usado no estágio$setWindowFieldspara retornar os primeiros valoresnde documentos em uma janela especÃfica.
Sintaxe
{ $firstN: { input: <expression>, n: <expression> } }
Opções
Campo | Tipo | Descrição |
|---|---|---|
| Expressão | A expressão |
| Expressão | O número de elementos que |
Comportamento
Valores nulos e ausentes
$firstNnão filtra valores nulos.$firstNconverte valores ausentes em nulo.
Comparação de $firstN e $topN
Os acumuladores $firstN e $topN podem realizar resultados semelhantes.
Em geral:
Se os documentos que chegam a
$groupjá estiverem ordenados, você deverá usar$firstN.Se você estiver classificando e selecionando os
nelementos principais, poderá usar$topNpara realizar ambas as tarefas com um acumulador.
Exemplos
Os exemplos nesta página utilizam a collection movies no conjunto de dados de amostra sample_mflix. Para saber como carregar o conjunto de dados de amostra em sua implantação do MongoDB , consulte Importar dados de amostra para sua implantação do Atlas .
Encontre os três primeiros filmes de um único gênero
Você pode usar o acumulador $firstN para encontrar os três primeiros filmes em um único gênero.
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $sort: { year: 1 } }, { $group: { _id: "Horror", firstThreeMovies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
O pipeline anterior:
Utiliza
$matchpara filtrar os resultados para filmes ondeHorrorestá incluÃdo na arraygenres.Classifica os resultados por
yearem ordem crescente.Agrupa todos os documentos resultantes em um único grupo.
Especifica os campos que são entrada para
$firstNcominput : ["$title", "$year"].Usa
$firstNpara retornar os três primeiros documentos do gêneroHorrorcomn: 3.
Encontre os três primeiros filmes em vários gêneros
Você pode usar o acumulador $firstN para encontrar os primeiros campos de entrada n em cada gênero.
db.movies.aggregate( [ { $unwind: "$genres" }, { $sort: { year: 1 } }, { $group: { _id: "$genres", movies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
O pipeline anterior:
Usa
$unwindpara criar um documento separado para cada gênero na arraygenres.Classifica os resultados por
yearem ordem crescente.Utiliza
$grouppara agrupar os resultados porgenres.Usa
$firstNpara retornar os três primeiros documentos de cada gênero comn: 3.Especifica os campos que são entrada para
$firstNcominput : ["$title", "$year"].Limita a saÃda a cinco documentos para melhorar a legibilidade.
Definir n com base na chave do grupo
Você pode atribuir o valor de n dinamicamente com base na chave do grupo. Neste exemplo, a expressão $cond utiliza o campo rated para alterar o valor de n:
db.movies.aggregate([ { $match: { rated: { $in: ["G", "PG", "PG-13", "R"] } } }, { $sort: { title: 1 } }, { $group: { _id: {"rated": "$rated"}, movies: { $firstN: { input: "$title", n: { $cond: { if: { $eq: ["$rated", "PG"] }, then: 3, else: 1 } } } } } } ] )
O pipeline anterior:
Filtros para filmes com classificações de
G,PG,PG-13ouR.Classifica os resultados alfabeticamente por
title.Agrupa filmes por
rated(a classificação do filme).Usa a expressão
$condpara retornar filmes3para filmes com classificaçãoPGe filme1para todas as outras classificações.
Na saÃda, a classificação PG retorna 3 filmes, enquanto as classificações G, PG-13 e R retornam 1 filme.