Docs Menu
Docs Home
/ /

$linearFill (operador de expresión)

$linearFill

Novedades en la versión 5.3.

Rellena null y los campos faltantes en un ventana usando interpolación lineal basado en los valores del campo circundante.

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

La expresión tiene esta $linearFill sintaxis:

{ $linearFill: <expression> }

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

$linearFill llena null y campos faltantes usando interpolación lineal basado en los valores de los campos circundantes que no sonnull. Los valores de los campos circundantes se determinan por el orden de clasificación especificado en $setWindowFields.

  • $linearFill completa null y los valores faltantes proporcionalmente, abarcando el rangonull de valores entre los valores circundantes que no son. Para determinar los valores de los campos faltantes, $linearFill utiliza:

    • La diferencia de los valores nonull circundantes.

    • El número de null campos a rellenar entre los valores circundantes.

  • $linearFill puede completar varios null valores consecutivos si dichos valores están precedidos y seguidos por valores que no seannull según el orden de clasificación especificado $setWindowFields en.

    Ejemplo

    Si una colección contiene estos documentos:

    { index: 0, value: 0 },
    { index: 1, value: null },
    { index: 2, value: null },
    { index: 3, value: null },
    { index: 4, value: 10 }

    Después de usar para completar $linearFill los null valores, los documentos se convierten en:

    { index: 0, value: 0 },
    { index: 1, value: 2.5 },
    { index: 2, value: 5 },
    { index: 3, value: 7.5 },
    { index: 4, value: 10 }

    Para ver un ejemplo completo, consulte Ejemplos.

  • null Los valores que no están precedidos ni seguidos por valores distintos denull siguen siendo null.

Para completar los valores de campo faltantes mediante interpolación lineal, 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.

Para completar los price valores faltantes mediante interpolación lineal, utilice dentro $linearFill $setWindowFields de una etapa:

db.stock.aggregate( [
{
$setWindowFields:
{
sortBy: { time: 1 },
output:
{
price: { $linearFill: "$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:

    • price como el campo en el que se deben rellenar los valores faltantes.

    • { $linearFill: "$price" } como el valor del campo faltante. completa$linearFill los price valores faltantes utilizando interpolación lineal basada en los price valores circundantes en la secuencia.

Ejemplo de salida:

[
{
_id: ObjectId("620ad555394d47411658b5ef"),
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
_id: ObjectId("620ad555394d47411658b5f0"),
time: ISODate("2021-03-08T10:00:00.000Z"),
price: 507.5
},
{
_id: ObjectId("620ad555394d47411658b5f1"),
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
_id: ObjectId("620ad555394d47411658b5f2"),
time: ISODate("2021-03-08T12:00:00.000Z"),
price: 505
},
{
_id: ObjectId("620ad555394d47411658b5f3"),
time: ISODate("2021-03-08T13:00:00.000Z"),
price: 495
},
{
_id: ObjectId("620ad555394d47411658b5f4"),
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 última observación trasladada:

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

$let

En esta página