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

時系列データの粒度の設定

項目一覧

  • 現在のバケット パラメータを取得
  • "granularity" パラメーターの使用
  • カスタム バケット パラメーターの使用
  • 時系列の粒度の変更

時系列コレクションを作成すると、MongoDB は自動的に system.buckets システム コレクションを作成し、受信した時系列データをバケットにグループ化します。 粒度を設定することで、データの取り込み率に基づいてデータがバケット化される頻度を制御します。

MongoDB 6.3 以降では、カスタム バケット パラメーターbucketMaxSpanSecondsbucketRoundingSecondsを使用してバケット境界を指定し、時系列データのバケット化方法をより正確に制御できます。

注意

コレクションが作成された後に時系列コレクションの粒度を変更するには、MongoDB 5.0.1 以降を実行している必要があります。 「 MongoDB 5.0 の既知の問題 」を参照してください。

現在のコレクション値を取得するには、 listCollectionsコマンドを使用します。

db.runCommand( { listCollections: 1 } )

時系列コレクションの場合、出力にはgranularitybucketMaxSpanSeconds 、および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値を使用する場合に 1 バケットのデータに含まれる最大時間間隔を示しています。

granularity
granularity バケット制限

seconds

1 時間

minutes

24 時間

hours

30 日間

デフォルトでは、 granularitysecondsに設定されています。 granularityの値を、同じデータソースからの受信測定値間の時間範囲に最も近い一致に設定するとパフォーマンスを向上できます。 たとえば、数千のセンサーから気象データを記録しているが、各センサーからのデータは 5 分に 1 回のみ記録する場合は、 granularity"minutes"に設定します。

db.createCollection(
"weather24h",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "minutes"
},
expireAfterSeconds: 86400
}
)

granularityhoursに設定すると、最大 1 か月量のデータ取り込みイベントが単一のバケットにグループ化されるため、トラバース時間が長くなり、クエリが遅くなります。 これをsecondsに設定すると、ポーリング間隔ごとに複数のバケットが使用されます。その多くには 1 つのドキュメントのみが含まれる場合があります。

Tip

以下も参照してください。

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の代わりにカスタム バケット パラメータbucketRoundingSecondsbucketMaxSpanSecondsを使用している場合は、両方のカスタム パラメータをcollModコマンドに含めて、同じ値に設定します。

db.runCommand( {
collMod: "weather24h",
timeseries: {
bucketRoundingSeconds: 86400,
bucketMaxSpanSeconds: 86400
}
} )

粒度間隔またはカスタム バケット値を減らすことはできません。

注意

シャーディングされた時系列コレクションの粒度を変更するには、MongoDB 6.0 以降を実行している必要があります。

戻る

時系列コレクション(TTL)の自動削除の設定