時系列コレクションの作成とクエリ
このページでは、時系列コレクションの作成とクエリの方法を例とともに紹介します。
時系列コレクションの作成
timeField
を時間データを含むフィールドとして定義し、metaField
をメタデータを含むフィールドとして定義します。
{ timeField: "timestamp", metaField: "metadata" }
この例では、timestamp
が timeField
の名前であり、metadata
が metaField
の名前です。timestamp
フィールドの値は日付型である必要があります。
重要
コレクションに適した metaField
を選択すると、ストレージとクエリパフォーマンスの両方が最適化されます。metaField
の選択とベストプラクティスの詳細については、「metaFields」を参照してください。
以下の 2 つのアプローチのいずれかを用いて、データの各バケットの時間間隔を定義します。
granularity
フィールドを定義します。{ granularity: "seconds" } granularity
値の選択の詳細については、「粒度に関する考慮事項」を参照してください。
または
MongoDB 6.3 以降では、
bucketMaxSpanSeconds
フィールドとbucketRoundingSeconds
フィールドを定義できます。いずれの値も同じにする必要があります。{ bucketMaxSpanSeconds: "300", bucketRoundingSeconds: "300" }
オプションとして、timeField
の値が少なくとも以下の値に達したときにドキュメントを期限切れにするようexpireAfterSeconds
を設定できます。
{ expireAfterSeconds: 86400 }
db.createCollection()
メソッドまたは create
コマンドのいずれかを使用してコレクションを作成します。次の例では、db.createCollection()
メソッドを使用して weather
時系列コレクションを作成しています。
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "seconds" }, expireAfterSeconds: 86400 } )
時系列フィールド参照
時系列コレクションには、次のフィールドが含まれます。
フィールド | タイプ | 説明 |
---|---|---|
| string | 必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、 |
| string | 任意。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、一意の時系列ドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータを変更する必要はめったにありません。指定されたフィールドの名前を
|
| integer | オプション。 可能な値は
粒度とバケット間隔の詳細については、「時系列データの粒度の設定」を参照してください。 |
| integer | オプション。 設定可能な値は 1~31536000 です。 バージョン 6.3 で追加。 |
| integer | オプション。 ドキュメントに新しいバケットが必要な場合、MongoDB ではドキュメントのタイムスタンプ値がこの間隔で切り捨てられ、バケットの最小時間が設定されます。 バージョン 6.3 で追加。 |
| 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 }