Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$locf (agregació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 del campo.

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

La expresión tiene esta $locf sintaxis:

{ $locf: <expression> }

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

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.

Para completar los valores de campo faltantes según el último valor observado en una secuencia, puede utilizar:

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.

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 por time en orden ascendente (1), de modo que el time más antiguo sea el primero.

  • Para los documentos donde price falta el campo, el operador $locf establece price en 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
}
]

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 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 del linearFillPrice campo. $linearFill completa price los valores faltantes usando interpolación lineal basada en los price valores circundantes en la secuencia.

    • locfPrice como campo objetivo a rellenar.

      • { $locf: "$price" } es el valor del locfPrice campo. representalocf la última observación trasladada. $locf completa price los 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
}
]

Volver

$ln

En esta página