$first (acumulador de agregação)
Nesta página
Definição
Alterado na versão 5.0.
Retorna o valor que resulta da aplicação de umaexpressão ao primeiro documento em um grupo de documentos. Só faz sentido quando os documentos estão em uma ordem definida.
$first
está disponível nestes estágios:
$setWindowFields
(Disponível a partir do MongoDB 5.0)
Observação
Desambiguação
Esta página descreve o acumulador de agregação do $first
. Para o operador de array $first
, consulte $first
(array operator)
.
Sintaxe
$first
sintaxe:
{ $first: <expression> }
Para mais informações sobre expressões, consulte Expressões.
Comportamento
Para definir a ordem do documento para $first
com o:
Estágio
$group
, adicione um estágio$sort
antes do estágio$group
.estágio
$setWindowFields
, defina o campo sortBy .
Observação
Embora o estágio $sort
passe documentos ordenados como entrada para os estágios $group
e $setWindowFields
, esses estágios não garantem que mantenham a ordem de classificação em sua própria saída.
Quando usado com $setWindowFields
, $first
retorna null
para Windows vazio. Um exemplo de janela vazia é uma janela de documentos { documents: [ -1, -1 ] }
no primeiro documento de uma partição.
Valores em falta
Os documentos em um grupo podem estar sem campos ou podem ter campos com valores ausentes.
Se não houver documentos do estágio anterior do pipeline, o estágio
$group
não retornará nada.Se o campo que o acumulador
$first
está em processamento estiver ausente,$first
retornaránull
.
Veja o exemplo de dados ausentes .
Exemplos
Usar no estágio $group
Crie a coleção sales
:
db.sales.insertMany( [ { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }, { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }, { "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }, { "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }, { "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") }, { "_id" : 6, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-15T12:05:10Z") }, { "_id" : 7, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T14:12:12Z") } ] )
Agrupando os documentos pelo campo item
, a operação a seguir usa o acumulador de $first
para calcular a primeira data de venda para cada item:
db.sales.aggregate( [ { $sort: { item: 1, date: 1 } }, { $group: { _id: "$item", firstSale: { $first: "$date" } } } ] )
A operação retorna os seguintes resultados:
[ { _id: 'jkl', firstSale: ISODate("2014-02-03T09:00:00.000Z") }, { _id: 'xyz', firstSale: ISODate("2014-02-03T09:05:00.000Z") }, { _id: 'abc', firstSale: ISODate("2014-01-01T08:00:00.000Z") } ]
Dados em falta
Alguns documentos na coleção badData
não têm campos, outros documentos não têm valores.
Crie a coleção badData
:
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" } } } ] )
O estágio $sort
ordena os documentos e os passa para o estágio $group
.
[ { _id: null, inStock: 5 }, { _id: 'album', inStock: '' }, { _id: 'cd', inStock: null }, { _id: 'tape', inStock: 4 } ]
$first
seleciona o primeiro documento de cada grupo de saída:
O grupo
_id: null
está incluído.Quando o campo acumulador,
$quantity
neste exemplo, está ausente,$first
retornanull
.
Usar no estágio $setWindowFields
Novidades na versão 5.0.
Crie uma collection cakeSales
que contenha vendas de bolo nos estados da Califórnia (CA
) e de Washington (WA
):
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
Este exemplo usa $first
no estágio $setWindowFields
para gerar a primeira type
de ordem de venda de bolo para cada state
:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { firstOrderTypeForState: { $first: "$type", window: { documents: [ "unbounded", "current" ] } } } } } ] )
No exemplo:
partitionBy: "$state"
particiona os documentos na collection porstate
. Existem partições paraCA
eWA
.sortBy: { orderDate: 1 }
classifica os documentos em cada partição pororderDate
em ordem crescente (1
), para que oorderDate
mais antigo seja o primeiro.
output
Define o campofirstOrderTypeForState
para o primeiro pedidotype
a partir da janela de documentos .A janela contém documentos entre um limite inferior
unbounded
e o documentocurrent
na saída. Isso significa que$first
retorna o primeiro pedidotype
para os documentos entre o início da partição e o documento atual.
Nessa saída, o valor type
da primeira ordem para CA
e WA
é mostrado no campo firstOrderTypeForState
:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "firstOrderTypeForState" : "strawberry" } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "firstOrderTypeForState" : "strawberry" } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "firstOrderTypeForState" : "strawberry" } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "firstOrderTypeForState" : "strawberry" } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "firstOrderTypeForState" : "strawberry" } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "firstOrderTypeForState" : "strawberry" }