Definição
$linearFillNovidades na versão 5.3.
Preenche
nulle campos ausentes em uma janela usando interpolação linear com base nos valores do campo circundante.$linearFillestá disponível somente no$setWindowFieldsestágio.
Sintaxe
A expressão tem esta $linearFill sintaxe:
{ $linearFill: <expression> }
Para mais informações sobre expressões, consulte Expressões.
Comportamento
$linearFill preenche null campos e ausentes usando interpolação linear com base emnull valores de campo não circundantes. Os valores dos campo circundantes são determinados pela ordem de classificação especificada $setWindowFields em.
$linearFillnullpreenche valores e ausentes abrangendo proporcionalmente o intervalonullde valores entre os valores não circundantes. Para determinar os valores para campos ausentes, o$linearFillutiliza:A diferença entre os valores circundantes que não são
null.O número de
nullcampos para preencher entre os valores circundantes.
$linearFillpode preencher váriosnullvalores de consecutivos se esses valores forem precedidos e seguidos pornullvalores não de acordo com a ordem de classificação especificada$setWindowFieldsem.Exemplo
Se uma coleção contiver estes documentos:
{ index: 0, value: 0 }, { index: 1, value: null }, { index: 2, value: null }, { index: 3, value: null }, { index: 4, value: 10 } Após utilizar para preencher
$linearFillosnullvalores, os documentos tornam-se:{ index: 0, value: 0 }, { index: 1, value: 2.5 }, { index: 2, value: 5 }, { index: 3, value: 7.5 }, { index: 4, value: 10 } Para obter um exemplo completo, consulte Exemplos.
nullvalores que não são precedidos e seguidos por valores diferentes denullpermanecemnull.
Comparação de $fill e $linearFill
Para preencher valores de campo ausentes usando interpolação linear, você pode usar:
O estágio
$fillcom{ method: "linear" }.Quando você usa o estágio
$fill, o campo especificado na saída é o mesmo campo usado pelos dados de origem. Consulte Preencher valores de campo ausentes com interpolação linear.O operador
$linearFill$setWindowFieldsdentro de um estágio.Ao utilizar o
$linearFilloperador, você pode configurar valores para um campo diferente do campo utilizado como os dados de origem. Consulte Usar vários métodos de preenchimento em um único estágio.
Exemplos
Os exemplos nesta página usam uma coleção stock que contém faixas do preço das ações de uma única empresa em intervalos de hora em 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 } ] )
O campo price está faltando em alguns documentos da coleção.
Preencher valores ausentes com interpolação linear
Para preencher os price valores de ausentes utilizando interpolação linear, utilize dentro $linearFill $setWindowFields de um estágio:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { price: { $linearFill: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }classifica os documentos pelo campotimeem ordem crescente, do mais antigo ao mais recente.saída especifica:
pricecomo o campo para o qual preencher os valores ausentes.{ $linearFill: "$price" }como valor para o campo ausente .$linearFillpreenchepriceos valores ausentes usando interpolação linear com base nospricevalores adjacentes na sequência.
Saída de exemplo:
[ { _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 } ]
Use vários métodos de preenchimento em um único estágio
Ao usar o estágio $setWindowFields para preencher valores ausentes, você pode definir valores para um campo diferente do campo do qual você preenche. Como resultado, você pode usar vários métodos de preenchimento em um único estágio $setWindowFields e gerar os resultados em campos distintos.
O pipeline a seguir preenche price campos ausentes usando interpolação linear e o método da última observação realizada:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { linearFillPrice: { $linearFill: "$price" }, locfPrice: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }classifica os documentos pelo campotimeem ordem crescente, do mais antigo ao mais recente.saída especifica:
linearFillPricecomo um campo de destino a ser preenchido.{ $linearFill: "$price" }é o valor dolinearFillPricecampo.$linearFillpreenchepriceos valores ausentes usando interpolação linear com base nospricevalores adjacentes na sequência.
locfPricecomo um campo de destino a ser preenchido.{ $locf: "$price" }é o valor para o campolocfPrice.locfrepresenta a última observação transportada.$locfpreenche os valorespriceausentes com o valor do documento anterior na sequência.
Saída de exemplo:
[ { _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 } ]
Restrições
Para utilizar o, você
$linearFilldeve utilizar o campo sortBy para classificar seus dados.Ao utilizar
$linearFilla função de janela do, o$setWindowFieldsretorna um erro se houver quaisquer valores repetidos no campo sortBy em uma única partição.