Definición
$locfNuevo en la versión 5.2.
Última observación trasladada. Establece valores para
nully campos faltantes en un ventana al último valor no nulo para el campo.$locfsolo está disponible en la$setWindowFieldsetapa.
Sintaxis
La expresión $locf tiene esta sintaxis:
{ $locf: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
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.
Comparación de $fill y $locf
Para completar los valores faltantes de campos basados en el último valor observado en una secuencia, se puede utilizar:
La
$filletapa{ method: "locf" }con.Al usar la
$filletapa, el campo que se especifica en la salida es el mismo que se utiliza en los datos de origen.Consulte Completar valores de campo faltantes según el último valor observado.El operador
$locf$setWindowFieldsdentro de una etapa.Cuando utilices el operador
$locf, puedes establecer valores en un campo diferente al campo utilizado como fuente de datos. Consulta Usar múltiples métodos de llenado en una sola etapa.
Ejemplos
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.
Rellenar los valores faltantes con el último valor observado
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 portimeen orden ascendente (1), de modo que eltimemás antiguo sea el primero.En los documentos donde falta el campo
price, el operador$locfestablece elpriceen 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 } ]
Usar varios métodos de rellenado en una sola etapa
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 campotimeen orden ascendente, del más antiguo al más reciente.La salida especifica:
linearFillPricecomo campo objetivo a rellenar.{ $linearFill: "$price" }es el valor para el campolinearFillPrice.$linearFillrellena los valorespricefaltantes utilizando interpolación lineal basándose en los valorespricecircundantes en la secuencia.
locfPricecomo campo objetivo a rellenar.{ $locf: "$price" }es el valor para el campolocfPrice.locfsignifica última observación realizada.$locfrellena los valorespricefaltantes 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 } ]