Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$locf (operador de expresión)

$locf

Nuevo en la versión 5.2.

Última observación trasladada. Establece valores para null y campos faltantes en un ventana al último valor no nulo para el campo.

$locf solo está disponible en la $setWindowFields etapa.

La expresión $locf tiene esta sintaxis:

{ $locf: <expression> }

Para obtener más información sobre las expresiones, consulta Expresiones.

Si un campo que se está completando contiene tanto valores null como valores no nulos, $locf establece los valores null y faltantes en el último valor no nulo conocido del campo según el orden de clasificación especificado en $setWindowFields.

null y los campos faltantes que aparecen antes de los valores no nulos en el orden de clasificación permanecen null.

Si un campo que se está completando contiene solo null o valores faltantes en una partición, establece el valor del campo$locf en null para esa partición.

Para completar los valores faltantes de campos basados en el último valor observado en una secuencia, se puede utilizar:

Los ejemplos en esta página utilizan una colección stock que contiene un rastreo del precio de las acciones de una sola empresa a intervalos horarios:

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
}
] )

Falta el campo price para algunos de los documentos de la colección.

El siguiente ejemplo utiliza el operador $locf para establecer los campos faltantes al valor del último valor observado que no esnull:

db.stock.aggregate( [
{
$setWindowFields: {
sortBy: { time: 1 },
output: {
price: { $locf: "$price" }
}
}
}
] )

En el ejemplo:

  • sortBy: { time: 1 } ordena los documentos de cada partición por time en orden ascendente (1), de modo que el time más antiguo sea el primero.

  • En los documentos donde falta el campo price, el operador $locf establece el price en el último valor observado de la secuencia.

Ejemplo de salida:

[
{
_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
}
]

Cuando se utiliza la etapa $setWindowFields para rellenar valores faltantes, se pueden asignar valores a un campo diferente al campo desde el cual se está llenando. Como resultado, puede utilizar varios métodos de llenado en una única etapa $setWindowFields y obtener los resultados en campos distintos.

La siguiente pipeline rellena los campos faltantes de price utilizando interpolación lineal y el método de última observación realizada:

db.stock.aggregate( [
{
$setWindowFields:
{
sortBy: { time: 1 },
output:
{
linearFillPrice: { $linearFill: "$price" },
locfPrice: { $locf: "$price" }
}
}
}
] )

En el ejemplo:

  • sortBy: { time: 1 } ordena los documentos por el campo time en orden ascendente, del más antiguo al más reciente.

  • La salida especifica:

    • linearFillPrice como campo objetivo a rellenar.

      • { $linearFill: "$price" } es el valor para el campo linearFillPrice. $linearFill rellena los valores price faltantes utilizando interpolación lineal basándose en los valores price circundantes en la secuencia.

    • locfPrice como campo objetivo a rellenar.

      • { $locf: "$price" } es el valor para el campo locfPrice. locf significa última observación realizada. $locf rellena los valores price faltantes con el valor del documento anterior en la secuencia.

Ejemplo de salida:

[
{
_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
}
]

Volver

$ln

En esta página