Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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 using interpolación lineal en función de los valores de campo circundantes.

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

La expresión $linearFill tiene esta 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 rellena null y valores faltantes de forma proporcional abarcando el rango de valores entre valoresnull consecutivos. Para determinar los valores de los campos faltantes, $linearFill utiliza:

    • La diferencia de los valores nonull circundantes.

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

  • $linearFill puede rellenar varios valores consecutivos null si esos valores están precedidos y seguidos por valores que no sonnull, de acuerdo con el orden de clasificación especificado en $setWindowFields.

    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 $linearFill para llenar los valores null, los documentos pasan a ser:

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

    Para un ejemplo completo, consulta Ejemplos.

  • null los valores que no están precedidos ni seguidos por valores que no sonnull permanecen null.

Para rellenar los valores de campo faltantes mediante interpolación lineal, puedes usar:

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.

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

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, de más antiguo a más reciente.

  • output especifica:

    • price como el campo para completar los valores faltantes.

    • { $linearFill: "$price" } como el valor para el campo faltante. $linearFill completa los valores faltantes de price utilizando interpolación lineal basado en los valores circundantes de price 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
}
]

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 campo time en orden ascendente, de más antiguo a más reciente.

  • output especifica:

    • linearFillPrice como un campo objetivo a llenar.

      • { $linearFill: "$price" } es el valor para el campo linearFillPrice. $linearFill rellena los valores de price faltantes usando interpolación lineal basada en los valores circundantes de price en la secuencia.

    • locfPrice como un campo objetivo a llenar.

      • { $locf: "$price" } es el valor para el campo locfPrice. locf significa última observación llevada adelante. $locf rellena los valores de price que faltan 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