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