時系列コレクションの作成とクエリ
このページでは、時系列コレクションの作成とクエリの方法を例とともに紹介します。
時系列コレクションの作成
時系列コレクションにデータを挿入する前に、 db.createCollection()
メソッドまたはcreate
コマンドのいずれかを使用してコレクションを明示的に作成する必要があります。
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "hours" } } )
timeseries
オブジェクト フィールド
時系列コレクションを作成するときは、次のオプションを指定します。
フィールド | タイプ | 説明 |
---|---|---|
timeseries.timeField | string | 必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、 |
timeseries.metaField | string | オプション。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、ユニークな一連のドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータは、変更されることはほとんどありません。 指定されたフィールドの名前は |
timeseries.granularity | string | 任意。可能な値は次のとおりです。
デフォルトでは、MongoDB は高頻度の取り込みの場合、 時系列コレクション内のデータが内部的に保存される方法を最適化してパフォーマンスを向上させるには、
|
expireAfterSeconds | 数値 | 任意。 ドキュメントの有効期限が切れるまでの秒数を指定して、時系列コレクション内のドキュメントの自動削除を有効にします。 MongoDB によって期限切れのドキュメントが自動的に削除されます。 詳しくは「時系列コレクション(TTL)の自動削除の設定」を参照してください。 |
timeseries
オプションで許可されるその他のオプションは次のとおりです。
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 }