Definición
$linearFillNovedades en la versión 5.3.
Rellena
nully los campos faltantes en un ventana usando interpolación lineal basado en los valores del campo circundante.$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 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.
$linearFillcompletanully los valores faltantes proporcionalmente, abarcando el rangonullde valores entre los valores circundantes que no son. Para determinar los valores de los campos faltantes,$linearFillutiliza:La diferencia de los valores no
nullcircundantes.El número de
nullcampos a rellenar entre los valores circundantes.
$linearFillpuede completar variosnullvalores consecutivos si dichos valores están precedidos y seguidos por valores que no seannullsegún 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 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.Al usar la
$filletapa, el campo que se especifica en la salida es el mismo que se utiliza en los datos de origen.Consulte "Rellenar valores de campo faltantes 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 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.
Rellenar 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 en el que se deben rellenar 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 } ]
Utilice múltiples métodos de llenado en una sola etapa
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 campotimeen orden ascendente, del más antiguo al más reciente.La salida especifica:
linearFillPricecomo campo objetivo a rellenar.{ $linearFill: "$price" }es el valor dellinearFillPricecampo.$linearFillcompletapricelos valores faltantes usando interpolación lineal basada en lospricevalores circundantes en 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.Al utilizar
$linearFillla función de ventana,$setWindowFieldsdevuelve un error si hay valores repetidos en el campo sortBy en una sola partición.