時系列データの粒度の設定
時系列コレクションを作成すると、MongoDB は自動的に system.buckets
システム コレクションを作成し、受信した時系列データをバケットにグループ化します。 粒度を設定することで、データの取り込み率に基づいてデータがバケット化される頻度を制御します。
MongoDB 6.3 以降では、カスタム バケット パラメーターbucketMaxSpanSeconds
とbucketRoundingSeconds
を使用してバケット境界を指定し、時系列データのバケット化方法をより正確に制御できます。
注意
コレクションが作成された後に時系列コレクションの粒度を変更するには、MongoDB 5.0.1 以降を実行している必要があります。 「 MongoDB 5.0 の既知の問題 」を参照してください。
現在のバケット パラメータを取得
現在のコレクション値を取得するには、 listCollections
コマンドを使用します。
db.runCommand( { listCollections: 1 } )
時系列コレクションの場合、出力にはgranularity
、 bucketMaxSpanSeconds
、およびbucketRoundingSeconds
パラメータが含まれます(存在する場合)。
{ cursor: { id: <number>, ns: 'test.$cmd.listCollections', firstBatch: [ { name: <string>, type: 'timeseries', options: { expireAfterSeconds: <number>, timeseries: { timeField: <string>, metaField: <string>, granularity: <string>, bucketMaxSpanSeconds: <number>, bucketRoundingSeconds: <number> } }, ... }, ... ] } }
"granularity" パラメーターの使用
次の表は、特定のgranularity
値を使用する場合に 1 バケットのデータに含まれる最大時間間隔を示しています。
granularity | granularity バケット制限 |
---|---|
| 1 時間 |
| 24 時間 |
| 30 日間 |
デフォルトでは、 granularity
はseconds
に設定されています。 granularity
の値を、同じデータソースからの受信測定値間の時間範囲に最も近い一致に設定するとパフォーマンスを向上できます。 たとえば、数千のセンサーから気象データを記録しているが、各センサーからのデータは 5 分に 1 回のみ記録する場合は、 granularity
を"minutes"
に設定します。
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "minutes" }, expireAfterSeconds: 86400 } )
granularity
をhours
に設定すると、最大 1 か月量のデータ取り込みイベントが単一のバケットにグループ化されるため、トラバース時間が長くなり、クエリが遅くなります。 これをseconds
に設定すると、ポーリング間隔ごとに複数のバケットが使用されます。その多くには 1 つのドキュメントのみが含まれる場合があります。
カスタム バケット パラメーターの使用
MongoDB 6.3 以降では、 granularity
の代わりに、2 つのカスタム バケット パラメータを使用してバケット境界を手動で設定できます。 午前 0 時から 4 時間ごとなど、固定的な時間間隔でデータをクエリする予定の場合は、このアプローチを検討してください。 これらの期間間でバケットが重複しないようにすると、高いクエリ ボリュームとinsert
操作が最適化されます。
カスタム バケット パラメータを使用するには、両方のパラメータを同じ値に設定し、 granularity
を設定しないでください。
bucketMaxSpanSeconds
同じバケット内のタイムスタンプ間の最大時間を設定します。設定可能な値は 1~31536000 です。bucketRoundingSeconds
は、新しいバケットの開始タイムスタンプを決定する時間間隔を設定します。 ドキュメントに新しいバケットが必要な場合、MongoDB ではドキュメントのタイムスタンプ値がこの間隔で切り捨てられ、バケットの最小時間が設定されます。
気象ステーションの例では、4時間ごとに概要レポートを生成する場合、 "minutes"
のgranularity
を使用する代わりに、カスタム バケット パラメータを 14400 秒に設定することでバケットを調整できます。
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "metadata", bucketMaxSpanSeconds: 14400, bucketRoundingSeconds: 14400 } } )
2023-03-27T16:24:35Z
という時間が設定されたドキュメントが既存バケットに収まらない場合、MongoDB は最小時間が2023-03-27T16:00:00Z
で、最大時間が2023-03-27T19:59:59Z
の新しいバケットを作成します。
時系列の粒度の変更
collMod
コマンドを使用して、 timeseries.granularity
を短い時間単位から長い時間単位に増やすことができます。
db.runCommand( { collMod: "weather24h", timeseries: { granularity: "seconds" | "minutes" | "hours" } } )
granularity
の代わりにカスタム バケット パラメータbucketRoundingSeconds
とbucketMaxSpanSeconds
を使用している場合は、両方のカスタム パラメータをcollMod
コマンドに含めて、同じ値に設定します。
db.runCommand( { collMod: "weather24h", timeseries: { bucketRoundingSeconds: 86400, bucketMaxSpanSeconds: 86400 } } )
粒度間隔またはカスタム バケット値を減らすことはできません。
注意
シャーディングされた時系列コレクションの粒度を変更するには、MongoDB 6.0 以降を実行している必要があります。