Definição
Retorna o resultado de uma expressão para o primeiro documento em um grupo de documentos. Só faz sentido quando os documentos estão em uma ordem definida.
O acumulador $first está disponível nos seguintes estágios:
Observação
Desambiguação
Esta página descreve $first 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 $first nestes outros contextos:
$first (expression), que retorna o primeiro elemento de uma array.$first (window function), que é usado no estágio$setWindowFieldspara retornar um valor para o primeiro documento em uma janela.
Sintaxe
{ $first: <expression> }
Comportamento
Definir Ordem do Documento
Para definir a ordem do documento para $first em um estágio de agrupamento, adicione um estágio $sort anterior.
Valores em falta
Documentos em um grupo podem estar sem campos. $first lida com valores ausentes da seguinte forma:
Se não houver documentos do estágio anterior do pipeline, o estágio
$groupnão retornará nada.Se o campo que o acumulador do
$firstestá em processamento estiver ausente, o$firstretornaránull.
Por exemplo, considere os seguintes documentos na collection badData, onde alguns documentos não têm campos:
db.badData.insertMany( [ { "_id": 1, "price": 6, "quantity": 6 }, { "_id": 2, "item": "album", "price": 5, "quantity": 5 }, { "_id": 7, "item": "tape", "price": 6, "quantity": 6 }, { "_id": 8, "price": 5, "quantity": 5 }, { "_id": 9, "item": "album", "price": 3, "quantity": '' }, { "_id": 10, "item": "tape", "price": 3, "quantity": 4 }, { "_id": 12, "item": "cd", "price": 7 } ] )
Consulte a coleção badData, agrupando a saída no campo item:
db.badData.aggregate( [ { $sort: { item: 1, price: 1 } }, { $group: { _id: "$item", inStock: { $first: "$quantity" } } } ] )
$first seleciona o primeiro documento de cada grupo de saída. Os documentos que não possuem o campo item são agrupados com um valor null para o campo _id. Quando o campo acumulador está ausente (quantity neste exemplo), $first retorna null.
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.
O exemplo a seguir classifica os filmes por ano e título e, em seguida, os agrupa por gênero para encontrar o filme mais antigo lançado em cada gênero:
db.movies.aggregate( [ { $sort: { year: 1, title: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", firstMovieTitle: { $first: "$title" }, firstMovieYear: { $first: "$year" } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
No pipeline anterior:
$sortordena filmes poryearem ordem crescente e, em seguida,titleem ordem alfabética.$unwindcria um documento separado para cada gênero na arraygenres, mantendo a ordem de classificação estabelecida pelo estágio anterior.$groupcom$firstretornatitleeyeardo primeiro filme (o mais antigo por ano, depois alfabeticamente por título) para cada gênero.Um segundo
$sortclassifica os resultados alfabeticamente por gênero.$limitrestringe a saída a gêneros 5.