時系列
時系列データとは、時間の経過に伴う変化を分析することでインサイトを得られるデータ ポイント列です。
通常、時系列データを構成するのは以下のコンポーネントです。
時間: データ ポイントが記録されています。
メタデータ(ソースとも)は、データ シリーズを識別するラベルまたはタグで、ほとんど変更されることはありません。 メタデータは metaField に保存されます。 時系列ドキュメント作成後、metaField を追加することはできなません。 metaField の動作と選択の詳細については、 metaField を参照してください。
測定値(メトリクスまたは値とも): 時間の経過とともに追跡されるデータ ポイントです。一般的に、時間とともに変化するキーと値のペアです。
次の表に、時系列データの例を示します。
例 | 測定値 | Metadata |
---|---|---|
株価データ | 株価 | 株式ティッカー、取引所 |
気象データ | 温度 | センサー識別子、ロケーション |
ウェブサイトの訪問者 | 閲覧数 | URL |
時系列データ ストレージの効率化に向け、MongoDB では時系列コレクションを提供しています。
時系列コレクション
バージョン 5.0 で追加
時系列コレクションは時系列データを効率的にストアします。時系列コレクションでは、同じソースから収集されたデータが、ほぼ同じ時点のデータ ポイントと一緒にストアされるよう、書込みが整理されます。
MongoDB Atlas でホストされている配置向け に UI で時系列コレクションを作成 できます。
メリット
時系列データを時系列コレクションにストアすると、通常のコレクションと比較して、クエリの効率が向上し、時系列データやセカンダリインデックスのディスク使用量が削減されます。MongoDB 6.3 以降では、新しい時系列コレクションの時間フィールドとメタデータ フィールド上に複合インデックスが自動的に作成されます。
時系列コレクションは、基礎となる列指向ストレージ形式を使用して、データを時間順にストアします。この形式には、次のメリットがあります。
時系列データの操作の簡素化
クエリ効率の向上
ディスク使用量の削減
読み取り操作の I/O を削減
WiredTiger キャッシュの使用量増加
動作
時系列コレクションは通常、他の MongoDB コレクションと同様に動作します。 通常どおり、データの挿入とクエリを行います。
警告
アップデート コマンドと削除コマンドのマッチ式は、metaField のみを指定できます。 時系列ドキュメント内の他のフィールドを更新することはできません。 詳細については「時系列削除と更新の制限 」を参照してください。
MongoDB では、時系列コレクションは、内部コレクションを基盤とした書込み可能な非マテリアライズド ビューとして扱われます。データを挿入すると、時系列データは内部コレクションにより最適化されたストレージ形式に自動的に整理されます。
MongoDB 6.3 以降は新しい時系列コレクションを作成すると、MongoDB は metaField フィールドと timeField フィールドに複合インデックスも生成します。クエリのパフォーマンスを向上させるため、時系列コレクションのクエリでは新しい複合インデックスが使用されます。複合インデックスもまた、最適化されたストレージ形式を使用しています。
Tip
クエリのパフォーマンスを高めるために、セカンダリ インデックスを測定フィールドまたは時系列コレクション内の任意のフィールドに手動で追加できます。
重要
下位互換性のない機能
以下のダウングレードを行う前に、時系列コレクションを削除する必要があります。
MongoDB 6.0 以降から MongoDB 5.0.7 またはそれ以前のバージョンへ
MongoDB 5.3 から MongoDB 5.0.5 以前のバージョンへ
警告
system.profile
という名前の時系列コレクションまたはビューを作成しないでください。MongoDB 6.3 以降のバージョンでこれを実行しようとすると、IllegalOperation
エラーが返されます。また、以前のバージョンの MongoDB はクラッシュします。
metaFields
時系列ドキュメントには、内部ストレージの最適化とクエリ効率の両方を目的として、ドキュメントのセットをグループ化するためのオプションの metaField を含めることができます。 metaField はほとんど変更されることはなく、任意のデータ型にすることができます。 metaField はオブジェクトにすることができ、サブフィールドを含めることができます。 フィールドを metaField として定義した後、metaField の値を変更することはできますが、metaField を別のフィールドとして再定義することはできません。 たとえば、metaField がフィールドA
として定義されている時系列ドキュメントを作成した場合、フィールドB
を後で metaField になるように変換することはできません。 ただし、metaField A
の値がオブジェクトの場合は、フィールドA
に新しいサブフィールドを追加できます。
注意
配列を metaField として使用すると、配列の等価性は特定の順序に依存するため、予期しないコレクション動作が発生する可能性があります。
バケット
MongoDB は metaField を使用してデータを分割し、効率的な組織と取得を可能にします。 時系列コレクションを作成すると、MongoDB はドキュメントをバケットにグループ化します。 バケット内のドキュメントは同じ metaField 値を共有し、近い値の timeField 値を持つドキュメントです。
時系列コレクション内のバケットの数は、一意の metaField 値の数によって異なります。 きめ細かな metaField 値または動的な metaField 値を持つコレクションでは、ほとんどまたはまったく変更されない単純な metaField を持つコレクションよりも多く、スパースに圧縮された、有効期間の短いバケットが生成される場合があります。 metaField の値がきめ細かで動的な場合、通常ストレージとクエリの効率は低下します。
Indexes
MongoDB は、時系列コレクションの metaField と timeField の両方に複合インデックスを自動的に作成します。
metaField のベストプラクティス
metaField の一部として、ほとんどまたはまったく変更されないフィールドを選択します。
可能であれば、metaField の一部として、フィルター式に一般的な識別子またはその他の安定値を選択します。
metaField の一部としてフィルタリングに使用されていないフィールドを選択することは避けてください。 代わりに、それらのフィールドを測定値として使用してください。
はじめる
時系列コレクションを初めて使用する場合は、「時系列コレクションの作成とクエリ」を参照してください。