$locf (agregação)
Nesta página
Definição
$locf
Novidades na versão 5.2.
Última observação levada adiante. Define valores para
null
e campos ausentes em umajanela para o último valor não nulo do campo.$locf
está disponível somente no estágio$setWindowFields
.
Sintaxe
A expressão $locf
tem esta sintaxe:
{ $locf: <expression> }
Para mais informações sobre expressões, consulte Operadores de Expressão.
Comportamento
Se um campo que está sendo preenchido contiver valores null
e não nulos, $locf
definirá os valores null
e ausentes como o último valor não nulo conhecido do campo, de acordo com a ordem de classificação especificada em $setWindowFields
.
null
e os valores de campo ausentes que aparecem antes dos valores não nulos na ordem de classificação permanecem null
.
Se um campo que está sendo preenchido contiver apenas null
ou valores ausentes em uma partição, $locf
definirá o valor do campo como null
para essa partição.
Comparação de $fill
e $locf
Para preencher valores de campo ausentes com base no último valor observado em uma sequência, você pode usar:
O estágio
$fill
com{ method: "locf" }
.Quando você utiliza o estágio
$fill
, o campo que você especifica na saída é o mesmo campo utilizado que os dados de origem. Consulte Preencher valores de campo ausentes com base no último valor observado.O operador
$locf
dentro de um estágio$setWindowFields
.Ao utilizar o operador
$locf
, você pode configurar valores para um campo diferente do campo utilizado como os dados de origem. Consulte Usar vários métodos de preenchimento em um único estágio.
Exemplos
Os exemplos nesta página usam uma coleção stock
que contém faixas do preço das ações de uma única empresa em intervalos de hora em hora:
db.stock.insertMany( [ { time: ISODate("2021-03-08T09:00:00.000Z"), price: 500 }, { time: ISODate("2021-03-08T10:00:00.000Z"), }, { time: ISODate("2021-03-08T11:00:00.000Z"), price: 515 }, { time: ISODate("2021-03-08T12:00:00.000Z") }, { time: ISODate("2021-03-08T13:00:00.000Z") }, { time: ISODate("2021-03-08T14:00:00.000Z"), price: 485 } ] )
O campo price
está faltando em alguns documentos da coleção.
Preencher valores ausentes com o último valor observado
O exemplo seguinte utiliza o operador $locf
para definir campos ausentes para o valor a partir do último valor nãonull
observado:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { price: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }
classifica os documentos em cada partição portime
em ordem crescente (1
), para que otime
mais antigo seja o primeiro.Para documentos em que o campo
price
está ausente, o operador$locf
defineprice
como o último valor observado na sequência.
Saída de exemplo:
[ { _id: ObjectId("62169b65394d47411658b5f5"), time: ISODate("2021-03-08T09:00:00.000Z"), price: 500 }, { _id: ObjectId("62169b65394d47411658b5f6"), time: ISODate("2021-03-08T10:00:00.000Z"), price: 500 }, { _id: ObjectId("62169b65394d47411658b5f7"), time: ISODate("2021-03-08T11:00:00.000Z"), price: 515 }, { _id: ObjectId("62169b65394d47411658b5f8"), time: ISODate("2021-03-08T12:00:00.000Z"), price: 515 }, { _id: ObjectId("62169b65394d47411658b5f9"), time: ISODate("2021-03-08T13:00:00.000Z"), price: 515 }, { _id: ObjectId("62169b65394d47411658b5fa"), time: ISODate("2021-03-08T14:00:00.000Z"), price: 485 } ]
Use vários métodos de preenchimento em um único estágio
Ao usar o estágio $setWindowFields
para preencher valores ausentes, você pode definir valores para um campo diferente do campo do qual você preenche. Como resultado, você pode usar vários métodos de preenchimento em um único estágio $setWindowFields
e gerar os resultados em campos distintos.
O pipeline a seguir preenche price
campos ausentes usando interpolação linear e o método last-observation-carries-forward:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { linearFillPrice: { $linearFill: "$price" }, locfPrice: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }
classifica os documentos pelo campotime
em ordem crescente, do mais antigo ao mais recente.saída especifica:
linearFillPrice
como um campo de destino a ser preenchido.{ $linearFill: "$price" }
é o valor do campolinearFillPrice
.$linearFill
preencheprice
valores ausentes usando interpolação linear com base nosprice
valores circundantes na sequência.
locfPrice
como um campo de destino a ser preenchido.{ $locf: "$price" }
é o valor do campolocfPrice
.locf
representa a última observação transportada.$locf
preenche os valoresprice
ausentes com o valor do documento anterior na sequência.
Saída de exemplo:
[ { _id: ObjectId("620ad555394d47411658b5ef"), time: ISODate("2021-03-08T09:00:00.000Z"), price: 500, linearFillPrice: 500, locfPrice: 500 }, { _id: ObjectId("620ad555394d47411658b5f0"), time: ISODate("2021-03-08T10:00:00.000Z"), linearFillPrice: 507.5, locfPrice: 500 }, { _id: ObjectId("620ad555394d47411658b5f1"), time: ISODate("2021-03-08T11:00:00.000Z"), price: 515, linearFillPrice: 515, locfPrice: 515 }, { _id: ObjectId("620ad555394d47411658b5f2"), time: ISODate("2021-03-08T12:00:00.000Z"), linearFillPrice: 505, locfPrice: 515 }, { _id: ObjectId("620ad555394d47411658b5f3"), time: ISODate("2021-03-08T13:00:00.000Z"), linearFillPrice: 495, locfPrice: 515 }, { _id: ObjectId("620ad555394d47411658b5f4"), time: ISODate("2021-03-08T14:00:00.000Z"), price: 485, linearFillPrice: 485, locfPrice: 485 } ]