Docs Menu
Docs Home
/
MongoDBマニュアル
/

時系列コレクションの作成とクエリ

項目一覧

  • 時系列コレクションの作成
  • 時系列コレクションへの測定値の挿入
  • 時系列コレクションをクエリする
  • 時系列コレクションでの集計の実行

このページでは、時系列コレクションの作成とクエリの方法を例とともに紹介します。

時系列コレクションにデータを挿入する前に、 db.createCollection()メソッドまたはcreateコマンドのいずれかを使用してコレクションを明示的に作成する必要があります。

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
}
}
)

注意

機能の互換性バージョン

featureCompatibilityVersionが 5.0 以上に設定されているシステム上でのみ、時系列コレクションを作成できます。

時系列コレクションを作成するときは、次のオプションを指定します。

フィールド
タイプ
説明
timeseries.timeField
string

必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、 timeFieldの値として有効な BSON 日付が必要です。

timeseries.metaField
string

オプション。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、ユニークな一連のドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータは、変更されることはほとんどありません。

指定されたフィールドの名前は_id または timeseries.timeFieldと同じであってはなりません。フィールドは任意のタイプにすることができます。

timeseries.granularity
string

任意。可能な値は次のとおりです。

  • "seconds"

  • "minutes"

  • "hours"

デフォルトでは、MongoDB は高頻度の取り込みの場合、 granularity"seconds"に設定します。

時系列コレクション内のデータが内部的に保存される方法を最適化してパフォーマンスを向上させるには、 granularityパラメーターを手動で設定します。 granularityの値を選択するには、連続する受信測定値間の時間範囲に最も近い一致を選択します。

timeseries.metaFieldを指定する場合は、 metaFieldフィールドに同じ一意の値を持つ連続した受信測定値間の時間範囲を考慮してください。 測定値は、同じソースから取得された場合、多くの場合、 metaFieldフィールドの一意の値と同じ値になります。

timeseries.metaFieldを指定しない場合は、コレクションに挿入されるすべての測定値間の時間範囲を考慮してください。

expireAfterSeconds
数値
任意。 ドキュメントの有効期限が切れるまでの秒数を指定して、時系列コレクション内のドキュメントの自動削除を有効にします。 MongoDB によって期限切れのドキュメントが自動的に削除されます。 詳しくは「時系列コレクション(TTL)の自動削除の設定」を参照してください。

timeseriesオプションで許可されるその他のオプションは次のとおりです。

  • storageEngine

  • indexOptionDefaults

  • collation

  • writeConcern

  • comment

Tip

次を参照してください。

挿入する各ドキュメントには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()メソッドを使用します。

Tip

挿入パフォーマンスの最適化

大規模な操作に合わせて挿入を最適化する方法については、「挿入の最適化」を参照してください。

標準の 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
}

戻る

時系列