Definición
$linearFillNovedades en la versión 5.3.
Rellena
nully los campos faltantes en un ventana using interpolación lineal en función de los valores de campo circundantes.$linearFillsolo está disponible en la$setWindowFieldsetapa.
Sintaxis
La expresión $linearFill tiene esta sintaxis:
{ $linearFill: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
$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.
$linearFillrellenanully valores faltantes de forma proporcional abarcando el rango de valores entre valoresnullconsecutivos. Para determinar los valores de los campos faltantes,$linearFillutiliza:La diferencia de los valores no
nullcircundantes.El número de campos
nulla llenar entre los valores circundantes.
$linearFillpuede rellenar varios valores consecutivosnullsi 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 para completar
$linearFilllosnullvalores, 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.
nullLos valores que no están precedidos ni seguidos por valores distintos denullsiguen siendonull.
Comparación de $fill y $linearFill
Para completar los valores de campo faltantes mediante interpolación lineal, puede utilizar:
La
$filletapa{ method: "linear" }con.Cuando utilice la etapa
$fill, el campo que especifique en la salida será el mismo campo utilizado como fuente de datos. Consulta Rellena los valores faltantes del campo con interpolación lineal.El operador
$linearFill$setWindowFieldsdentro de una etapa.Cuando utilices el operador
$linearFill, puedes establecer valores en un campo diferente al campo utilizado como fuente de datos. Consulta Usar múltiples métodos de llenado 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 para algunos de los documentos de la colección.
Rellenar los valores faltantes con interpolación lineal
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 campotimeen orden ascendente, del más antiguo al más reciente.La salida especifica:
pricecomo el campo para completar los valores faltantes.{ $linearFill: "$price" }como el valor del campo faltante. completa$linearFilllospricevalores faltantes utilizando interpolación lineal basada en lospricevalores 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 } ]
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, del más antiguo al más reciente.La salida especifica:
linearFillPricecomo campo objetivo a rellenar.{ $linearFill: "$price" }es el valor para el campolinearFillPrice.$linearFillrellena los valores depricefaltantes usando interpolación lineal basada en los valores circundantes depriceen la secuencia.
locfPricecomo campo objetivo a rellenar.{ $locf: "$price" }es el valor dellocfPricecampo. representalocfla última observación trasladada.$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 } ]
Restricciones
Para utilizar,
$linearFilldebe utilizar el campo sortBy para ordenar sus datos.Cuando se usa la función de ventana
$linearFill,$setWindowFieldsdevuelve un error si hay algún valor repetido en el campo sortBy en una sola partición.