Docs Menu

$locf(集計)

$locf

バージョン 5.2 で追加

Last observation carried forward(LOCF)法。ウィンドウ内の null および欠落しているフィールドの値として、フィールドの最後の null 以外の値を設定します。

$locf$setWindowFieldsステージでのみ使用可能です。

$locf式は次の構文をとります。

{ $locf: <expression> }

式の詳細については、「式演算子」を参照してください。

入力されているフィールドにnullと null 以外の値の両方が含まれている場合、 $locfは、$setWindowFields で指定された並べ替え順序に従って、 nullと欠損値をフィールドの最後の既知の null 以外の値に設定し

並べ替え順序において null 以外の値の前に表示されるnullと欠落しているフィールド値はnullのままになります。

入力されているフィールドにパーティション内でnullまたは欠落値のみが含まれている場合、 $locfはそのパーティションのフィールド値をnullに設定します。

シーケンス内の最後の観察値に基づいて欠落しているフィールド値を入力するには、次を使用します。

このページの例では、1 つの会社の株価を時間単位で追跡するstockコレクションを使用します。

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
}
] )

コレクション内の一部のドキュメントでpriceフィールドが欠落しています。

次の例では、 $locf演算子を使用して、欠落しているフィールドに最後に確認された以外のnull値の値を設定します。

db.stock.aggregate( [
{
$setWindowFields: {
sortBy: { time: 1 },
output: {
price: { $locf: "$price" }
}
}
}
] )

この例では、次のことが行われます。

  • sortBy: { time: 1 } は、各パーティション内のドキュメントを time を基準に昇順(1)にソートするため、最も古い time が最初になります。

  • priceフィールドが欠落しているドキュメントの場合、 $locf演算子はpriceをシーケンス内で最後に確認された値に設定します。

出力例:

[
{
_id: ObjectId("62169b65394d47411658b5f5"),
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
_id: ObjectId("62169b65394d47411658b5f6"),
time: ISODate("2021-03-08T10:00:00.000Z"),
price: 500
},
{
_id: ObjectId("62169b65394d47411658b5f7"),
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
_id: ObjectId("62169b65394d47411658b5f8"),
time: ISODate("2021-03-08T12:00:00.000Z"),
price: 515
},
{
_id: ObjectId("62169b65394d47411658b5f9"),
time: ISODate("2021-03-08T13:00:00.000Z"),
price: 515
},
{
_id: ObjectId("62169b65394d47411658b5fa"),
time: ISODate("2021-03-08T14:00:00.000Z"),
price: 485
}
]

$setWindowFieldsステージを使用して欠落値を入力する場合、入力フィールドとは異なるフィールドに値を設定できます。 その結果、単一の$setWindowFieldsステージで複数の入力メソッドを使用して、結果を個別のフィールドに出力できます。

次のパイプラインは、price 線形補間 を使用して欠落している フィールドを入力します および last-observation-caled-forward メソッド。

db.stock.aggregate( [
{
$setWindowFields:
{
sortBy: { time: 1 },
output:
{
linearFillPrice: { $linearFill: "$price" },
locfPrice: { $locf: "$price" }
}
}
}
] )

この例では、次のことが行われます。

  • sortBy: { time: 1 }は、ドキュメントをtimeフィールドで最初から最新の順に昇順でソートします。

  • 出力は以下を指定します。

    • 入力するターゲット フィールドとしてlinearFillPriceを入力します。

      • { $linearFill: "$price" }linearFillPriceフィールドの値です。 $linearFillprice 線形補間 を使用して欠落している 値を埋めます シーケンス内の周囲のprice 値に基づきます。

    • 入力するターゲット フィールドとしてlocfPriceを入力します。

      • { $locf: "$price" }locfPriceフィールドの値です。 locfは、転送された最後の観察を示します。 $locfは、欠落しているprice値をシーケンス内の前のドキュメントの値で埋めます。

出力例:

[
{
_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
}
]