Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$locf (agregação)

Nesta página

  • Definição
  • Sintaxe
  • Comportamento
  • Exemplos
$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.

A expressão $locf tem esta sintaxe:

{ $locf: <expression> }

Para mais informações sobre expressões, consulte Operadores de Expressão.

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.

Para preencher valores de campo ausentes com base no último valor observado em uma sequência, você pode usar:

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.

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 por time em ordem crescente (1), para que o time mais antigo seja o primeiro.

  • Para documentos em que o campo price está ausente, o operador $locf define price 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
}
]

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 campo time 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 campo linearFillPrice . $linearFill preenche price valores ausentes usando interpolação linear com base nos price valores circundantes na sequência.

    • locfPrice como um campo de destino a ser preenchido.

      • { $locf: "$price" } é o valor do campo locfPrice . locf representa a última observação transportada. $locf preenche os valores price 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
}
]

Voltar

$ln