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 nestes estágios:
Observação
Desambiguação
Esta página descreve $first 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 $first nestes outros contextos:
$first (expression), que retorna o primeiro elemento de um 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 coleção badData, onde alguns documentos estão com campos ausentes:
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. Documentos que não têm 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 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.
O exemplo a seguir classifica filmes por ano e título e depois 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, depoistitleem ordem alfabética.$unwindcria um documento separado para cada gênero no arraygenres, mantendo a ordem de classificação estabelecida pelo estágio anterior.$groupcom$firstretorna otitlee oyeardo primeiro filme (o mais antigo por ano, depois em ordem alfabética por título) para cada gênero.Um segundo
$sortclassifica os resultados em ordem alfabética por gênero.$limitrestringe a saída a 5 gêneros.