Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$linearFill (operador de expressã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 $setWindowFields estágio.

A expressão tem esta $linearFill sintaxe:

{ $linearFill: <expression> }

Para mais informações sobre expressões, consulte Expressões.

$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.

  • $linearFill null preenche valores e ausentes abrangendo proporcionalmente o intervalonull de valores entre os valores não circundantes. Para determinar os valores para campos ausentes, o$linearFill utiliza:

    • A diferença entre os valores circundantes que não sãonull.

    • O número de null campos para preencher entre os valores circundantes.

  • $linearFill pode preencher vários null valores de consecutivos se esses valores forem precedidos e seguidos pornull valores não de acordo com a ordem de classificação especificada $setWindowFields em.

    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 $linearFill os null valores, 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 permanecem null.

Para preencher valores de campo ausentes usando interpolação linear, você pode usar:

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.

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 campo time 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 valor para o campo ausente . $linearFill preenche price os valores ausentes usando interpolação linear com base nos price valores 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
}
]

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 campo time 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 linearFillPrice campo. $linearFill preenche price os valores ausentes usando interpolação linear com base nos price valores adjacentes na sequência.
    • locfPrice como um campo de destino a ser preenchido.

      • { $locf: "$price" } é o valor para o campo locfPrice . locf representa a última observação transportada. $locf preenche os valores price 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
}
]