Definición
$linearFillNuevo en la versión 5.3.
Completar
nully los campos faltantes en una ventana usando interpolación lineal basada en los valores de los campos circundantes.$linearFillsolo está disponible en la$setWindowFieldsetapa.
Sintaxis
La expresión tiene esta $linearFill sintaxis:
{ $linearFill: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
$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.
$linearFillrellenanully los valores faltantes de forma proporcional, abarcando el rangonullde valores entre los valores no circundantes. 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 llenar múltiplesnullvalores consecutivos si esos valores están precedidos y seguidos por valores que no sonnullde acuerdo con el orden de clasificación especificado$setWindowFieldsen.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
$linearFilllosnullvalores, 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.
nulllos valores que no están precedidos ni seguidos por valores que no sonnullpermanecennull.
Comparación de $fill y $linearFill
Para rellenar los valores de campo faltantes mediante interpolación lineal, puedes usar:
La etapa
$fillcon{ method: "linear" }.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.Al usar el
$linearFilloperador, puede establecer valores para un campo diferente al campo utilizado como datos de origen. Consulte la sección "Usar varios métodos de relleno 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 en algunos de los documentos de la colección.
Rellenar los valores faltantes con interpolación lineal
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 campotimeen orden ascendente, de más antiguo a más reciente.output especifica:
pricecomo el campo para completar los valores faltantes.
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, de más antiguo a más reciente.output especifica:
linearFillPricecomo un campo objetivo a llenar.{ $linearFill: "$price" }es el valor para ellinearFillPricecampo.$linearFillrellenapricelos valores faltantes mediante interpolación lineal basada en lospricevalores circundantes en la secuencia.
locfPricecomo un campo objetivo a llenar.{ $locf: "$price" }es el valor para el campolocfPrice.locfsignifica última observación llevada adelante.$locfrellena los valores depriceque 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 } ]
Restricciones
Para usar,
$linearFilldebe usar el campo sortBy para ordenar sus datos.Al usar
$linearFillla función de ventana,$setWindowFieldsdevuelve un error si hay valores repetidos en el campo sortBy en una sola partición.