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

時系列コレクションに関する考慮事項

項目一覧

  • metaField に関する考慮事項
  • metaField ベストプラクティス
  • ストレージと濃度
  • 粒度
  • 圧縮とハードウェア

時系列コレクションは通常、一般的なコレクションと同様に動作しますが、例外があります。時系列コレクションの動作と構造については、 時系列コレクションを参照してください。

metaField はほとんど変更されず、任意のデータ型にできます。metaField はオブジェクトにすることができ、サブフィールドを含めることができます。フィールドをmetaFieldとして定義した後、metaFieldの値は変更できますが、metaFieldを別のフィールドとして再定義することはできません。たとえば、metaField がフィールド A として定義されている時系列ドキュメントを作成した場合、フィールド B を後で metaField に変換することはできません。ただし、A の値がオブジェクトである場合は、A に新しいサブフィールドを追加できます。

注意

配列を metaField として使用すると、配列の等価性は特定の順序に依存するため、コレクションが予期しない動作をする可能性があります。

MongoDB は、効率的な整理と取得のために metaField を使用してデータを分割します。時系列コレクションを作成すると、MongoDB はドキュメントをバケットにグループ化します。バケット内のドキュメントは同一の metaField 値を共有し、近接した timeField 値を持ちます。

時系列コレクションのバケットの数は、一意な metaField 値の数に依存します。細かい値や動的な metaField 値を持つコレクションは、ほとんど変化しないか全く変化しない単純な metaField 値を持つコレクションよりも、より多くの、まばらに詰め込まれた、存続期間の短いバケツを生成する可能性があります。きめ細かく動的な metaField 値は、一般的にストレージとクエリの効率を低下させます。

  • metaField の一部として、ほとんどまたはまったく変更されないフィールドを選択します。

  • 可能であれば、metaField の一部として、フィルター式に一般的な識別子またはその他の安定値を選択します。

  • metaField の一部としてフィルタリングに使用されていないフィールドを選択することは避けてください。 代わりに、それらのフィールドを測定値として使用してください。

時系列コレクションにデータを挿入すると、内部コレクションはバケットを使用して自動的にデータを最適化されたストレージ形式に整理します。適切なバケットが存在する場合、MongoDB はそのバケットに新しいデータを挿入します。適切なバケットが存在しない場合、MongoDB は新しいバケットを作成します。ストレージを最適化するには、ほとんど変更されない metaField を選択して、バケットの数が少なく、密度の高い時系列コレクションを作成します。

細かな、または変化する metaField 値を持つコレクションは、まばらに詰め込まれた存続期間が短いバケットを多数生成し、コレクションの濃度を増加させます。濃度が高くなると、ストレージとクエリの効率が低下します。

granularity パラメータを使用して、データ取り込みレートに基づいて MongoDB が時系列データをバケット化する頻度を指定できます。次の表は、特定の granularity 値を使用した場合の 1 バケットのデータに含まれる最大時間間隔を示しています。

granularity
granularity バケット制限

seconds

1 時間

minutes

24 時間

hours

30 日間

デフォルトでは、granularityseconds に設定されています。同じデータソースからの受信測定値間の時間範囲に最も近い値に granularity 値を設定するとパフォーマンスを向上できます。たとえば、数千のセンサーから気象データを記録しているが、各センサーからのデータは 5 分に 1 回のみ記録する場合は、granularity"minutes" に設定します。新しいドキュメントを追加する頻度が低いほど、粒度が粗いストレージとパフォーマンス上の利点が大きくなります。

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

granularity 値を選択する際には、一般的なクエリも考慮する必要があります。たとえば、クエリで一度に 1 日分のデータを取得することが予想される場合は、「minutes」を使用します。「seconds」のように細かくすると、1 時間分のバケットが作成されます。これには、同じデータを表すためにより多くのバケットが必要になり、ストレージとクエリのパフォーマンスに悪影響を及ぼします。「hours」のようなより粗い粒度(30 日のバケット範囲)では、クエリで一度に 30 日のデータを取得し、そのほとんどをフィルタリングで除外する必要があります。

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

すべての時系列コレクションでは、開いたバケットまたは再度開いたバケットにデータを追加するときに、圧縮されたバケット形式を使用します。キャッシュ内の時系列データを圧縮することで、効率的なクエリパフォーマンスを維持しながら、高濃度のワークロードをサポートします。

戻る

時系列データ