Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$linearFill (operador de expresión)

$linearFill

Nuevo en la versión 5.3.

Completar null y los campos faltantes en una ventana usando interpolación lineal basada en los valores de los campos circundantes.

$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 rellena null y los campos faltantes mediante interpolación lineal basada ennull los valores de los campos circundantes que no son. Los valores de los campos circundantes se determinan mediante el orden de clasificación especificado $setWindowFields en.

  • $linearFill rellena null y los valores faltantes de forma proporcional, abarcando el rangonull de valores entre los valores no circundantes. 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 llenar múltiples null valores consecutivos si esos valores están precedidos y seguidos por valores que no sonnull de acuerdo con 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 rellenar $linearFill los null valores, los documentos quedan así:

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

  • output especifica:

    • price como el campo para completar los valores faltantes.

    • { $linearFill: "$price" } como valor para el campo faltante. $linearFillrellena los valores faltantes price mediante interpolación lineal basada en los valores circundantes 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 linearFillPrice campo. $linearFill rellena price los valores faltantes mediante interpolación lineal basada en los price valores circundantes 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
}
]