$linearFill (agregação)
Nesta página
Definição
$linearFill
Novidades na versão 5.3.
Preenche
null
e campos ausentes em uma janela usando interpolação linear com base nos valores do campo circundante.$linearFill
está disponível somente no estágio$setWindowFields
.
Sintaxe
A expressão $linearFill
tem esta sintaxe:
{ $linearFill: <expression> }
Para mais informações sobre expressões, consulte Operadores de Expressão.
Comportamento
$linearFill
preenche null
e campos ausentes usando interpolação linear com base nosnull
valores de campo não circundantes. Os valores de campo circundantes são determinados pela ordem de classificação especificada em $setWindowFields
.
$linearFill
preenchenull
e valores ausentes abrangendo proporcionalmente o intervalo de valores entre os valores nãonull
circundantes. Para determinar os valores para campos ausentes, o$linearFill
utiliza:A diferença entre os valores circundantes que não são
null
.O número de
null
campos para preencher entre os valores circundantes.
$linearFill
pode preencher vários valoresnull
consecutivos se esses valores forem precedidos e seguidos por valores nãonull
de acordo com a ordem de classificação especificada em$setWindowFields
.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
$linearFill
para preencher os valoresnull
, 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.
null
valores que não são precedidos e seguidos por valores diferentes denull
permanecemnull
.
Comparação de $fill
e $linearFill
Para preencher valores de campo ausentes usando interpolação linear, você pode usar:
O estágio
$fill
com{ 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
dentro de um estágio$setWindowFields
.Ao utilizar o operador
$linearFill
, 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 ausentes usando interpolação linear, use 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 campotime
em ordem crescente, do mais antigo ao mais recente.saída especifica:
price
como o campo para o qual preencher os valores ausentes.{ $linearFill: "$price" }
como o valor do campo ausente.$linearFill
preencheprice
valores ausentes usando interpolação linear com base nosprice
valores circundantes 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 last-observation-carries-forward:
db.stock.aggregate( [ { $setWindowFields: { sortBy: { time: 1 }, output: { linearFillPrice: { $linearFill: "$price" }, locfPrice: { $locf: "$price" } } } } ] )
No exemplo:
sortBy: { time: 1 }
classifica os documentos pelo campotime
em ordem crescente, do mais antigo ao mais recente.saída especifica:
linearFillPrice
como um campo de destino a ser preenchido.{ $linearFill: "$price" }
é o valor do campolinearFillPrice
.$linearFill
preencheprice
valores ausentes usando interpolação linear com base nosprice
valores circundantes na sequência.
locfPrice
como um campo de destino a ser preenchido.{ $locf: "$price" }
é o valor para o campolocfPrice
.locf
representa a última observação transportada.$locf
preenche os valoresprice
ausentes 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 usar
$linearFill
, você deve usar o campo sortBy para classificar os dados.Ao usar a função de janela
$linearFill
,$setWindowFields
retorna um erro se houver valores repetidos no campo sortBy em uma única partição.