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.$locfis only available in the$setWindowFieldsstage.
Sintaxe
The $locf expression has this syntax:
{ $locf: <expression> }
Para mais informações sobre expressões, consulte Expressões.
Comportamento
If a field being filled contains both null and non-null values, $locf sets the null and missing values to the field's last known non-null value according to the sort order specified in $setWindowFields.
null e os valores de campo ausentes que aparecem antes dos valores não nulos na ordem de classificação permanecem null.
If a field being filled contains only null or missing values in a partition, $locf sets the field value to null for that partition.
Comparison of $fill and $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.The
$locfoperator inside of a$setWindowFieldsstage.When you use the
$locfoperator, you can set values for a different field than the field used as the source data. See Use Multiple Fill Methods in a Single Stage.
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
The following example uses the $locf operator to set missing fields to the value from the last-observed non-null value:
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.For documents where the
pricefield is missing, the$locfoperator sets thepriceto the last-observed value in the sequence.
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 do campolinearFillPrice.$linearFillpreenche os valorespriceausentes usando interpolação linear com base nos valorespriceadjacentes na sequência.
locfPricecomo um campo de destino a ser preenchido.{ $locf: "$price" }is the value for thelocfPricefield.locfstands for last observation carried forward.$locffills missingpricevalues with the value from the previous document in the sequence.
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 } ]