時系列コレクションの作成とクエリ
このページでは、時系列コレクションの作成とクエリの方法を例とともに紹介します。
時系列コレクションの作成
db.createCollection()
メソッドまたはcreate
コマンドのいずれかを使用してコレクションを作成します。たとえば:
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata" }})
時間データを含むフィールドにtimeField
を設定し、メタデータを含むフィールドにmetaField
を設定します。
timeseries: { timeField: "timestamp", metaField: "metadata" }
重要
メタフィールドの動作と選択の詳細については、「メタフィールド」を参照してください。
以下の 2 つのアプローチのいずれかを用いて、データの各バケットの時間間隔を定義します。詳細については、「時系列データの詳細な設定」を参照してください。
granularity
フィールドを定義します。timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "seconds" }
または
MongoDB 6.3 以降では、
bucketMaxSpanSeconds
フィールドとbucketRoundingSeconds
フィールドを定義できます。いずれの値も同じにする必要があります。timeseries: { timeField: "timestamp", metaField: "metadata", bucketMaxSpanSeconds: "300", bucketRoundingSeconds: "300" }
オプションとして、timeField
の値が少なくとも以下の値に達したときにドキュメントを期限切れにするようexpireAfterSeconds
を設定できます。
timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "seconds" }, expireAfterSeconds: 86400
時系列フィールド参照
時系列コレクションには、次のフィールドが含まれます。
フィールド | タイプ | 説明 |
---|---|---|
timeseries.timeField | string | 必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、 |
timeseries.metaField | string | 任意。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、一意の時系列ドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータを変更する必要はめったにありません。指定されたフィールドの名前を
|
timeseries.granularity | integer | オプション。 可能な値は
粒度とバケット間隔の詳細については、「時系列データの粒度の設定」を参照してください。 |
timeseries.bucketMaxSpanSeconds | integer | オプション。 設定可能な値は 1~31536000 です。 バージョン 6.3 で追加。 |
timeseries.bucketRoundingSeconds | integer | オプション。 ドキュメントに新しいバケットが必要な場合、MongoDB ではドキュメントのタイムスタンプ値がこの間隔で切り捨てられ、バケットの最小時間が設定されます。 バージョン 6.3 で追加。 |
expireAfterSeconds | integer | オプション。ドキュメントの有効期限が切れるまでの秒数を指定して、時系列コレクション内のドキュメントの自動削除を有効にします。MongoDB によって期限切れのドキュメントが自動的に削除されます。詳しくは「時系列コレクション(TTL)の自動削除の設定」を参照してください。 |
時系列コレクション固有ではない、その他の許可されたオプションは次のとおりです。
storageEngine
indexOptionDefaults
collation
writeConcern
comment
時系列コレクションへの測定値の挿入
挿入する各ドキュメントには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()
メソッドを使用します。
時系列コレクションをクエリする
時系列コレクションのクエリは、標準の MongoDB コレクションのクエリと同じ方法で実行します。
時系列コレクションから 1 つのドキュメントを返すには、次を実行します。
db.weather.findOne({ "timestamp": ISODate("2021-05-18T00:00:00.000Z") })
出力例:
{ timestamp: ISODate("2021-05-18T00:00:00.000Z"), metadata: { sensorId: 5578, type: 'temperature' }, temp: 12, _id: ObjectId("62f11bbf1e52f124b84479ad") }
時系列クエリの詳細については、「クエリパフォーマンスの最適化」を参照してください。
時系列コレクションでの集計の実行
その他のクエリ機能については、次のような集計パイプラインを使用してください。
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 }