Definição
$locfNovidades na versão 5.2.
Última observação levada adiante. Define valores para
nulle campos ausentes em uma janela para o último valor não nulo do campo.$locfestá disponível somente no$setWindowFieldsestágio.
Sintaxe
A expressão tem esta $locf sintaxe:
{ $locf: <expression> }
Para mais informações sobre expressões, consulte Expressões.
Comportamento
Se um campo que está sendo preenchido contiver null valores e não nulos, definirá$locf os null valores e ausentes como o último valor não nulo conhecido do campo, de acordo com a ordem de classificação especificada $setWindowFields em.
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, definirá o valor do campo$locf 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
$fillcom{ 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$setWindowFieldsdentro de um estágio.Ao utilizar o
$locfoperador, 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 para definir campos ausentes para o valor a partir do $locf últimonull valor não observado:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { price: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }classifica os documentos em cada partição portimeem ordem crescente (1), para que otimemais antigo seja o primeiro.Para documentos em que o
pricecampo está ausente, o operador$locfdefinepricecomo 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 da última observação realizada:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { linearFillPrice: { $linearFill: "$price" }, locfPrice: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }classifica os documentos pelo campotimeem ordem crescente, do mais antigo ao mais recente.saída especifica:
linearFillPricecomo um campo de destino a ser preenchido.{ $linearFill: "$price" }é o valor dolinearFillPricecampo.$linearFillpreenchepriceos valores ausentes usando interpolação linear com base nospricevalores adjacentes na sequência.
locfPricecomo um campo de destino a ser preenchido.{ $locf: "$price" }é o valor dolocfPricecampo. representalocfa última observação transportada.$locfpreenchepriceos valores 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 } ]