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 is only available in the $setWindowFields stage.

The $linearFill expression has this syntax:

{ $linearFill: <expression> }

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

$linearFill preenche null e campos ausentes usando interpolação linear com base nos valores de campo não null circundantes. Os valores de campo circundantes são determinados pela ordem de classificação especificada em $setWindowFields.

  • $linearFill fills null and missing values proportionally spanning the value range between surrounding non-null values. To determine the values for missing fields, $linearFill uses:

    • 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 can fill multiple consecutive null values if those values are preceded and followed by non-null values according to the sort order specified in $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 }

    After using $linearFill to fill the null values, the documents become:

    { 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 valores de price ausentes utilizando interpolação linear, utilize $linearFill dentro de um estágio $setWindowFields:

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