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 del campo.$locfsolo está disponible en la$setWindowFieldsetapa.
Sintaxis
La expresión tiene esta $locf sintaxis:
{ $locf: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Si un campo que se está completando contiene null valores y no nulos, establece$locf los null valores y faltantes en el último valor no nulo conocido del campo de acuerdo con el orden de clasificación especificado $setWindowFields en.
null y los valores de campo faltantes que aparecen antes de valores no nulos en el orden de clasificación permanecen como 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 de campo faltantes según el último valor observado en una secuencia, 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 de esta página utilizan una colección stock que contiene el seguimiento del precio de las acciones de una sola empresa en intervalos de una 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 } ] )
Falta el campo price para algunos de los documentos de la colección.
Complete los valores faltantes con el último valor observado
El siguiente ejemplo utiliza el operador para establecer los campos faltantes en el valor del $locf últimonull valor observado que no es:
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.Para los documentos donde
pricefalta el campo, el operador$locfestablecepriceen el último valor observado en 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 } ]
Utilice múltiples métodos de llenado en una sola etapa
Al usar la etapa para completar valores faltantes, puede establecer valores para un campo diferente al que $setWindowFields $setWindowFields utiliza para completar. Por lo tanto, puede usar varios métodos de llenado en una sola etapa y mostrar los resultados en campos distintos.
La siguiente canalización rellena los price campos faltantes mediante interpolación lineal y el método de la última observación llevada adelante:
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 dellinearFillPricecampo.$linearFillcompletapricelos valores faltantes usando interpolación lineal basada en lospricevalores circundantes en la secuencia.
locfPricecomo campo objetivo a rellenar.{ $locf: "$price" }es el valor dellocfPricecampo. representalocfla última observación trasladada.$locfcompletapricelos valores 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 } ]