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

$linearFill(集計)

項目一覧

  • 定義
  • 構文
  • 動作
  • 制限事項
$linearFill

バージョン 5.3 で追加。

線形補間 nullを使用して、 ウィンドウ 内の と欠落フィールドを埋めます 周囲のフィールド値に基づきます。

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

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

{ $linearFill: <expression> }

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

線形補間 を使用して、$linearFillnull と欠落フィールドを埋めます 周囲のnull のフィールド値に基づきます。周囲のフィールド値は、 $setWindowFieldsで指定された並べ替え順序によって決定されます。

  • $linearFillは、周囲のnull以外の値の間の値範囲に按分された、 nullと欠損値を埋めます。 欠落しているフィールドの値を決定するために、 $linearFillは以下を使用します。

    • 周囲のnullの値との差。

    • 周囲の値の間に入力するnullフィールドの数。

  • $linearFillは、 $setWindowFieldsで指定された並べ替え順序に従って、それらの値が先行してnullの値に続く場合、複数の連続するnull値を入力できます。

    これらのドキュメントがコレクションに含まれている場合:

    { index: 0, value: 0 },
    { index: 1, value: null },
    { index: 2, value: null },
    { index: 3, value: null },
    { index: 4, value: 10 }

    $linearFillを使用してnullの値を入力すると、ドキュメントは次のようになります。

    { index: 0, value: 0 },
    { index: 1, value: 2.5 },
    { index: 2, value: 5 },
    { index: 3, value: 7.5 },
    { index: 4, value: 10 }

    完全な例については、「例 」を参照してください。

  • null nullの値が先行せず、その後に続く値は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フィールドが欠落しています。

線形補間 を使用して欠落しているprice 値を入力するには は、 ステージ内で$linearFill $setWindowFieldsを使用します。

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

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

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

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

    • price 欠落値を入力するフィールドとして。

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

出力例:

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

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

戻る

$let