Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

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

戻る

$ln