Definición
$locfNuevo en la versión 5.2.
Última observación llevada hacia adelante. Establece los valores para
nully los campos ausentes en una 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á llenando contiene tanto null como valores no nulos, establece$locf los null valores y faltantes al último valor no nulo conocido del campo según el orden de clasificación especificado $setWindowFields en.
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á llenando 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 etapa
$fillcon{ method: "locf" }.Cuando utilizas la
$filletapa, el campo que especificas en la salida es el mismo campo utilizado como fuente de datos. Consulta Completa los valores de campos faltantes con base en el último valor observado.El operador
$locf$setWindowFieldsdentro de una etapa.Al usar el
$locfoperador, puede establecer valores para un campo diferente al campo utilizado como datos de origen. Consulte la sección "Usar varios métodos de relleno 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 en algunos de los documentos de la colección.
Rellenar los valores faltantes con el último valor observado
El siguiente ejemplo utiliza el operador para establecer los campos faltantes al 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 establece$locfelpriceal ú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 } ]
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.
El siguiente pipeline rellena los campos faltantes de price utilizando interpolación lineal y el método last-observation-carried-forward:
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, de más antiguo a más reciente.output especifica:
linearFillPricecomo un campo objetivo a llenar.{ $linearFill: "$price" }es el valor para ellinearFillPricecampo.$linearFillrellenapricelos valores faltantes mediante interpolación lineal basada en lospricevalores circundantes en la secuencia.
locfPricecomo un campo objetivo a llenar.{ $locf: "$price" }es el valor para ellocfPricecampo. representalocfla última observación arrastrada.$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 } ]