時系列コレクションに関する考慮事項
時系列コレクションは通常、一般的なコレクションと同様に動作しますが、例外があります。時系列コレクションの動作と構造については、 時系列コレクションを参照してください。
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 の一部として、フィルター式に一般的な識別子またはその他の安定値を選択します。
metaField の一部としてフィルタリングに使用されていないフィールドを選択することは避けてください。 代わりに、それらのフィールドを測定値として使用してください。
ストレージと濃度
時系列コレクションにデータを挿入すると、内部コレクションはバケットを使用して自動的にデータを最適化されたストレージ形式に整理します。適切なバケットが存在する場合、MongoDB はそのバケットに新しいデータを挿入します。適切なバケットが存在しない場合、MongoDB は新しいバケットを作成します。ストレージを最適化するには、ほとんど変更されない metaField
を選択して、バケットの数が少なく、密度の高い時系列コレクションを作成します。
細かな、または変化する metaField
値を持つコレクションは、まばらに詰め込まれた存続期間が短いバケットを多数生成し、コレクションの濃度を増加させます。濃度が高くなると、ストレージとクエリの効率が低下します。
粒度
granularity
パラメータを使用して、データ取り込みレートに基づいて MongoDB が時系列データをバケット化する頻度を指定できます。次の表は、特定の granularity
値を使用した場合の 1 バケットのデータに含まれる最大時間間隔を示しています。
granularity | granularity バケット制限 |
---|---|
| 1 時間 |
| 24 時間 |
| 30 日間 |
デフォルトでは、granularity
は seconds
に設定されています。同じデータソースからの受信測定値間の時間範囲に最も近い値に granularity
値を設定するとパフォーマンスを向上できます。たとえば、数千のセンサーから気象データを記録しているが、各センサーからのデータは 5 分に 1 回のみ記録する場合は、granularity
を "minutes"
に設定します。新しいドキュメントを追加する頻度が低いほど、粒度が粗いストレージとパフォーマンス上の利点が大きくなります。
granularity
をhours
に設定すると、最大 1 か月量のデータ取り込みイベントが単一のバケットにグループ化されるため、トラバース時間が長くなり、クエリが遅くなります。 これをseconds
に設定すると、ポーリング間隔ごとに複数のバケットが使用されます。その多くには 1 つのドキュメントのみが含まれる場合があります。
granularity
値を選択する際には、一般的なクエリも考慮する必要があります。たとえば、クエリで一度に 1 日分のデータを取得することが予想される場合は、「minutes」を使用します。「seconds」のように細かくすると、1 時間分のバケットが作成されます。これには、同じデータを表すためにより多くのバケットが必要になり、ストレージとクエリのパフォーマンスに悪影響を及ぼします。「hours」のようなより粗い粒度(30 日のバケット範囲)では、クエリで一度に 30 日のデータを取得し、そのほとんどをフィルタリングで除外する必要があります。
例については、「時系列データの粒度の設定」を参照してください。
圧縮とハードウェア
すべての時系列コレクションでは、開いたバケットまたは再度開いたバケットにデータを追加するときに、圧縮されたバケット形式を使用します。キャッシュ内の時系列データを圧縮することで、効率的なクエリパフォーマンスを維持しながら、高濃度のワークロードをサポートします。