Definição
Retorna uma agregação dos primeiros n elementos dentro de um grupo. Os resultados só são significativos 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 nestes estágios:
Observação
Desambiguação
Esta página descreve $firstN quando usado como um acumulador. 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 um array.$firstN (window function), que é usado no$setWindowFieldsestágio para retornar os primeirosnvalores de 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 | The number of elements that |
Comportamento
Valores nulos e ausentes
$firstNnão filtra valores nulos.$firstNconverte valores ausentes em nulo.
Comparação de $firstN e $topN
Ambos os acumuladores $firstN e $topN podem obter 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
The examples on this page use the movies collection in the sample_mflix sample dataset. To learn how to load the sample dataset into your MongoDB deployment, see Import Sample Data Into Your Atlas Deployment.
Encontre os três primeiros filmes para 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:
Usa
$matchpara filtro os resultados para filmes ondeHorrorestá incluÃdo no 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.
Encontrar os três primeiros filmes em vários gêneros
Você pode usar o acumulador $firstN para encontrar os primeiros n campos de entrada 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 no 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 de grupo
Você pode atribuir o valor de n dinamicamente com base na chave do grupo. Neste exemplo, a expressão $cond usa 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.Ordena os resultados alfabeticamente por
title.Agrupa filmes por
rated(a classificação do filme).Usa a expressão
$condpara retornar3filmes para filmes com classificaçãoPGe1filme para 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 cada.