AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$densify(集計ステージ)

$densify

バージョン5.1の新機能。

フィールド内の特定の値が欠落しているドキュメントのシーケンス内に新しいドキュメントを作成します。

$densifyは以下の目的で使用できます。

  • 時系列データのギャップを埋めます。

  • データのグループ間に欠落値を追加します。

  • 指定した範囲の値をデータに入力します。

$densifyステージの構文は次のとおりです。

{ $densify: { field: <fieldName>, partitionByFields: [ <field 1>, <field 2> ... <field n> ], range: { step: <number>, unit: <time unit>, bounds: < "full" || "partition" > || [ < lower bound >, < upper bound > ] } }}

$densifyステージは次のフィールドを持つドキュメントを取得します。

フィールド
必要性
説明

必須

高密度化するフィールド。 指定されたfieldの値は、すべて数値またはすべての日付である必要があります。

指定されたfieldを含まないドキュメントは、変更されずにパイプラインを通過します。

<field> を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。

制限については、「 field制限 」を参照してください。

任意

ドキュメントをグループ化するための複合キーとして機能するフィールドのセット。 $densifyステージでは、各ドキュメントグループはパーティションと呼ばれます。

このフィールドを省略すると、 $densifyはコレクション全体に対して 1 つのパーティションを使用します。

例については、`パーティションによる圧縮を参照してください。

制限については、「 partitionByFields制限 」を参照してください。

必須

データの圧縮方法を指定するオブジェクト。

必須

range.boundsは次のいずれかとして指定できます。

  • An array: [ < lower bound >, < upper bound > ],

  • string: "full"または"partition"のいずれか。

boundsが配列の場合:

  • $densify は、指定された境界内の値の範囲にわたるドキュメントを追加します。

  • 限界のデータ型は、圧縮されるフィールドのデータ型に対応している必要があります。

  • 動作の詳細については、「range.bounds 動作」を参照してください。

boundsが"full"の場合

  • $densifyは、圧縮されているfieldの値の全範囲にまたがるドキュメントを追加します。

boundsが"partition"の場合

  • $densifyは各パーティションでfull範囲の圧縮を個別に実行した場合と同様に、各パーティションにドキュメントを追加します。

必須

各ドキュメントのフィールド値の増加量。 $densifyは既存のドキュメント間の各stepに新しいドキュメントを作成します。

range.unitが指定されている場合、 stepは整数である必要があります。 それ以外の場合、 stepは任意の数値にすることができます。

フィールドが日付の場合は必須です。

フィールドの日付値を増加させるときにステップフィールドに適用する単位。

unitには次のいずれかの値を string として指定できます。

  • millisecond

  • second

  • minute

  • hour

  • day

  • week

  • month

  • quarter

  • year

例については、「時系列データの圧縮 」を参照してください。

指定されたフィールドを含むドキュメントで、次の場合、 $densifyはエラーを返します。

  • コレクション内のどのドキュメントにも、 fieldの値は date 型で、単位フィールドは指定されていません。

  • コレクション内のすべてのドキュメントには、数値型のfield値と単位フィールドが指定されています。

  • fieldの名前は$で始まります。 フィールドを高密度にする場合は、フィールドの名前を変更する必要があります。 フィールド名を変更するには、 $projectを使用します。

  • バージョン 8.1 の新機能:

    field partitionByFields 配列のいずれかのフィールドと接頭辞を共有します。例えば、field と partitionByFields の次の組み合わせではエラーが発生します。

    • field: "timestamp", partitionByFields: ["timestamp"]

    • field: "timestamp", partitionByFields: ["timestamp.hours"]

    • field: "timestamp.hours", partitionByFields: ["timestamp"]

$densifypartitionByFields 配列内のいずれかのフィールド名がある場合は、 エラーが発生します。

  • 非 string 値として評価されます。

  • $から始まります。

range.Boundsが配列の場合:

  • 下限は、コレクション内のドキュメントに関係なく、追加されたドキュメントの開始値を示します。

  • 下限は包括的です。

  • 上限は排他的です。

  • $densifyは、指定された範囲外のフィールド値を持つドキュメントをフィルタリングしません。

注意

MongoDB8.0 以降、$densify は下限と上限が等しい限界を空のセットとして扱い、限界をフィールド値として持つドキュメントを生成しません。

以前のバージョンでは、$densify は下限と上限が等しい限界を閉じた間隔として扱い、限界値を持つドキュメントをフィールド値として生成します。コレクションは、限界値を持つドキュメントがまだ含まれていない場合に限ります。

例、範囲 .[10, 10]10 8.0は、 より前のバージョンでは、フィールド値が である追加のドキュメントを生成しますが、8.0 以降ではそのようなドキュメントは生成されません。

$densify は、internalQueryMaxAllowedDensifyDocs パラメーターで設定された制限より多くのドキュメントを生成する場合、エラーを返します。デフォルトでは、この制限は 500,000 ドキュメントです。

生成されるドキュメントを増やすには、internalQueryMaxAllowedDensifyDocs パラメータの値を増やします。

$densify は、出力するドキュメントのソート順序を保証しません。

並べ替え順序を保証するには、並べ替えるフィールドで$sortを使用します。

4 時間以上の温度の読み取りを含むweatherコレクションを作成します。

db.weather.insertMany( [ { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T00:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T04:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T08:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T12:00:00.000Z"), "temp": 12 }] )

この例では、 $densifyステージを使用して 4 時間間隔のギャップを埋め、データ ポイントの 1 時間ごとの粒度を実現します。

db.weather.aggregate( [ { $densify: { field: "timestamp", range: { step: 1, unit: "hour", bounds:[ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ] } } }] )

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

  • $densifyステージは、記録された温度間の時間差を埋めます。

    • field: "timestamp" はtimestampフィールドを生成します。
  • range:

    • step: 1 は、 timestampフィールドを 1 単位増加させます。

    • unit: hour は、 timestampフィールドを時間単位で生成します。

    • bounds: [ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ] は、圧縮される時間の範囲を設定します。

次の出力では、 $densifyステージは00:00:00と08:00:00の時間の間の時間差を埋めます。

[ { _id: ObjectId("618c207c63056cfad0ca4309"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T00:00:00.000Z"), temp: 12 }, { timestamp: ISODate("2021-05-18T01:00:00.000Z") }, { timestamp: ISODate("2021-05-18T02:00:00.000Z") }, { timestamp: ISODate("2021-05-18T03:00:00.000Z") }, { _id: ObjectId("618c207c63056cfad0ca430a"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T04:00:00.000Z"), temp: 11 }, { timestamp: ISODate("2021-05-18T05:00:00.000Z") }, { timestamp: ISODate("2021-05-18T06:00:00.000Z") }, { timestamp: ISODate("2021-05-18T07:00:00.000Z") }, { _id: ObjectId("618c207c63056cfad0ca430b"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T08:00:00.000Z"), temp: 11 } { _id: ObjectId("618c207c63056cfad0ca430c"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T12:00:00.000Z"), temp: 12 }]

2 種類のコードのデータを含むcoffeeコレクションを作成します。

db.coffee.insertMany( [ { "altitude": 600, "variety": "Arabica Typica", "score": 68.3 }, { "altitude": 750, "variety": "Arabica Typica", "score": 69.5 }, { "altitude": 950, "variety": "Arabica Typica", "score": 70.5 }, { "altitude": 1250, "variety": "Gesha", "score": 88.15 }, { "altitude": 1700, "variety": "Gesha", "score": 95.5, "price": 1029 } ] )

この例では、 $densifyを使用して、各クッキーvarietyのaltitudeフィールドを高密度化します。

db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "full", step: 200 } } }] )

集計の例:

  • ドキュメントをvarietyで分割して、 Arabica Typica用の 1 つのグループとGeshaフィルター用の 1 つのグループを作成します。

  • full範囲を指定します。つまり、各 パーティションの既存のドキュメントの全範囲にわたってデータが圧縮されます。

  • 200のstepを指定します。つまり、新しいドキュメントは200のaltitude間隔で作成されます。

この集計は、次のドキュメントを出力します。

[ { _id: ObjectId("618c031814fbe03334480475"), altitude: 600, variety: 'Arabica Typica', score: 68.3 }, { _id: ObjectId("618c031814fbe03334480476"), altitude: 750, variety: 'Arabica Typica', score: 69.5 }, { variety: 'Arabica Typica', altitude: 800 }, { _id: ObjectId("618c031814fbe03334480477"), altitude: 950, variety: 'Arabica Typica', score: 70.5 }, { variety: 'Gesha', altitude: 600 }, { variety: 'Gesha', altitude: 800 }, { variety: 'Gesha', altitude: 1000 }, { variety: 'Gesha', altitude: 1200 }, { _id: ObjectId("618c031814fbe03334480478"), altitude: 1250, variety: 'Gesha', score: 88.15 }, { variety: 'Gesha', altitude: 1400 }, { variety: 'Gesha', altitude: 1600 }, { _id: ObjectId("618c031814fbe03334480479"), altitude: 1700, variety: 'Gesha', score: 95.5, price: 1029 }, { variety: 'Arabica Typica', altitude: 1000 }, { variety: 'Arabica Typica', altitude: 1200 }, { variety: 'Arabica Typica', altitude: 1400 }, { variety: 'Arabica Typica', altitude: 1600 }]

この画像には、 $densifyで作成されたドキュメントが可視化されています。

この例では、 $densifyを使用して、各variety内のaltitudeフィールドのギャップのみを強調表示します。

db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "partition", step: 200 } } }] )

集計の例:

  • ドキュメントをvarietyで分割して、 Arabica Typica用の 1 つのグループとGeshaフィルター用の 1 つのグループを作成します。

  • partition範囲を指定します。つまり、各パーティション内でデータが圧縮されます。

    • Arabica Typicaパーティションの場合、範囲は600 - 950です。

    • Geshaパーティションの場合、範囲は1250 - 1700です。

  • 200のstepを指定します。つまり、新しいドキュメントは200のaltitude間隔で作成されます。

この集計は、次のドキュメントを出力します。

[ { _id: ObjectId("618c031814fbe03334480475"), altitude: 600, variety: 'Arabica Typica', score: 68.3 }, { _id: ObjectId("618c031814fbe03334480476"), altitude: 750, variety: 'Arabica Typica', score: 69.5 }, { variety: 'Arabica Typica', altitude: 800 }, { _id: ObjectId("618c031814fbe03334480477"), altitude: 950, variety: 'Arabica Typica', score: 70.5 }, { _id: ObjectId("618c031814fbe03334480478"), altitude: 1250, variety: 'Gesha', score: 88.15 }, { variety: 'Gesha', altitude: 1450 }, { variety: 'Gesha', altitude: 1650 }, { _id: ObjectId("618c031814fbe03334480479"), altitude: 1700, variety: 'Gesha', score: 95.5, price: 1029 }]

この画像には、 $densifyで作成されたドキュメントが可視化されています。

このページを評価