時系列コレクション
バージョン 5.0 で追加
時系列コレクションは一定期間にわたる測定値のシーケンスを効率的に保存します。 時系列データとは、一定時間にわたって収集され、1 つ以上の変更されていないパラメーターによって一意に識別される任意のデータです。 時系列データを識別する変更不可のパラメーターは、通常、データソースのメタデータです。
例 | 測定値 | Metadata |
---|---|---|
気象データ | 温度 | センサー識別子、ロケーション |
株価データ | 株価 | 株式ティッカー、取引所 |
ウェブサイトの訪問者 | 閲覧数 | URL |
時系列コレクション
バージョン 5.0 で追加
時系列コレクションは時系列データを効率的にストアします。時系列コレクションでは、同じソースから収集されたデータが、ほぼ同じ時点のデータ ポイントと一緒にストアされるよう、書込みが整理されます。
MongoDB Atlas でホストされている配置向け に UI で時系列コレクションを 作成 できます。
メリット
時系列データを時系列コレクションにストアすると、通常のコレクションと比較して、クエリの効率が向上し、時系列データやセカンダリ インデックスのディスク使用量が削減されます。
手順
時系列コレクションの作成
注意
featureCompatibilityVersionが5.0に設定されているシステム上でのみ、時系列コレクションを作成できます。
時系列コレクションにデータを挿入する前に、 db.createCollection()
メソッドまたはcreate
コマンドのいずれかを使用してコレクションを明示的に作成する必要があります。
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "hours" } } )
時系列コレクションを作成するときは、次のオプションを指定します。
フィールド | タイプ | 説明 |
---|---|---|
timeseries.timeField | string | 必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、 timeField の値として有効な BSON 日付が必要です。 |
timeseries.metaField | string | オプション。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、ユニークな一連のドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータは、変更されることはほとんどありません。 指定されたフィールドの名前は |
timeseries.granularity | string | 任意。 指定できる値は、 時系列コレクション内のデータが内部的に保存される方法を最適化してパフォーマンスを向上させるには、
|
expireAfterSeconds | 数値 | 任意。 ドキュメントの有効期限が切れるまでの秒数を指定して、時系列コレクション内のドキュメントの自動削除を有効にします。 MongoDB によって期限切れのドキュメントが自動的に削除されます。 詳しくは「時系列コレクション(TTL)の自動削除の設定」を参照してください。 |
timeseries
オプションで許可されるその他のオプションは次のとおりです。
storageEngine
indexOptionDefaults
collation
writeConcern
comment
警告
MongoDB サーバーがクラッシュするため、 system.profile
という名前の時系列コレクションまたはビューを作成しないでください。
時系列コレクションへの測定値の挿入
挿入する各ドキュメントには1つの測定値を含める必要があります。複数のドキュメントを一度に挿入するには、次のコマンドを発行します。
db.weather.insertMany( [ { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T00:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T04:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T08:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T12:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T16:00:00.000Z"), "temp": 16 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T20:00:00.000Z"), "temp": 15 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T00:00:00.000Z"), "temp": 13 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T04:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T08:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T12:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T16:00:00.000Z"), "temp": 17 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-19T20:00:00.000Z"), "temp": 12 } ] )
単一のドキュメントを挿入するには、 db.collection.insertOne()
メソッドを使用します。
時系列コレクションをクエリする
時系列コレクションから 1 つのドキュメントを検索するには、次のコマンドを発行します。
db.weather.findOne({ "timestamp": ISODate("2021-05-18T00:00:00.000Z") })
時系列コレクションでの集計の実行
その他のクエリ機能については、次のような集計パイプラインを使用してください。
db.weather.aggregate( [ { $project: { date: { $dateToParts: { date: "$timestamp" } }, temp: 1 } }, { $group: { _id: { date: { year: "$date.year", month: "$date.month", day: "$date.day" } }, avgTmp: { $avg: "$temp" } } } ] )
この集計パイプライングループの例では、すべてのドキュメントが測定日ごとにグループ化され、その日のすべての温度測定値の平均が返されます。
{ "_id" : { "date" : { "year" : 2021, "month" : 5, "day" : 18 } }, "avgTmp" : 12.714285714285714 } { "_id" : { "date" : { "year" : 2021, "month" : 5, "day" : 19 } }, "avgTmp" : 13 }
コレクションが 時系列 タイプであるかどうかを確認
コレクションがタイプ時系列であるかどうかを確認するには、 listCollectionsコマンドを使用します。
db.runCommand( { listCollections: 1.0 } )
コレクションが時系列コレクションの場合、これが返されます。
{ cursor: { id: <number>, ns: 'test.$cmd.listCollections', firstBatch: [ { name: <string>, type: 'timeseries', options: { expireAfterSeconds: <number>, timeseries: { ... } }, ... }, ... ] } }
動作
時系列コレクションは、通常のコレクションと同様に動作します。 通常どおり、データの挿入とクエリができます。 MongoDB では、時系列コレクションは、挿入時に時系列データを最適化されたストレージ形式に自動的に整理する内部コレクションに対する書込み可能な非マテリアライズド ビュー として扱われます。
時系列コレクションをクエリする場合、1 回の測定ごとに 1 つのドキュメントに対して操作します。 時系列コレクションに対するクエリでは、最適化された内部ストレージ形式を活用して、結果がより速く返されます。
Index
Tip
クエリのパフォーマンスを向上させるために、 metaField
とtimeField
として指定されたフィールドに セカンダリ インデックス を手動で追加できます。
時系列コレクションは、データを時間順に自動的に順序付け、インデックスを作成します。 時系列コレクションの内部インデックスはlistIndexes
では表示されません。
1970-01-01T00:00:00.000Z
の前または2038-01-19T03:14:07.000Z
の後にtimeField
値を持つドキュメントをコレクションに挿入すると、MongoDB は警告をログに記録し、一部のクエリ最適化で内部インデックスを使用できなくなります。 クエリ パフォーマンスを回復し、ログ警告を解決するには、 timeField
にセカンダリ インデックスを作成します。
デフォルトの圧縮アルゴリズム
時系列コレクションは、コレクションの作成時にstorageEngine
オプションを使用して別の圧縮アルゴリズムが指定されていない限り、グローバルデフォルト圧縮アルゴリズムであるsnappyを無視し、 zstdを優先します。 たとえば、新しいweather
コレクションの圧縮アルゴリズムをsnappy
に変更するには、次のオプションを追加します。
db.createCollection( "weather", { timeseries: { timeField: "timestamp" }, storageEngine: { wiredTiger: { configString: "block_compressor=snappy" } } } )
有効なblock_compressor
オプションは次のとおりです。
snappy
zlib
zstd
(デフォルト)none