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

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

項目一覧

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

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

重要

機能の互換性バージョンの要件

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

1

db.createCollection() メソッドまたはcreate コマンドのいずれかを使用してコレクションを作成します。たとえば:

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

時間データを含むフィールドにtimeFieldを設定し、メタデータを含むフィールドにmetaFieldを設定します。

timeseries: {
timeField: "timestamp",
metaField: "metadata"
}

重要

メタフィールドの動作と選択の詳細については、「メタフィールド」を参照してください。

3

以下の 2 つのアプローチのいずれかを用いて、データの各バケットの時間間隔を定義します。詳細については、「時系列データの詳細な設定」を参照してください。

重要

時系列の粒度の変更

作成後、 collModメソッドを使用して粒度またはバケット定義を変更できます。ただし、各バケットでカバーされる時間の範囲は増やすことしかできません。減らすことはできません。

  1. granularityフィールドを定義します。

    timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    granularity: "seconds"
    }

または

  1. MongoDB 6.3 以降では、 bucketMaxSpanSecondsフィールドとbucketRoundingSecondsフィールドを定義できます。いずれの値も同じにする必要があります。

    timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    bucketMaxSpanSeconds: "300",
    bucketRoundingSeconds: "300"
    }
4

オプションとして、timeFieldの値が少なくとも以下の値に達したときにドキュメントを期限切れにするようexpireAfterSecondsを設定できます。

timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "seconds"
},
expireAfterSeconds: 86400

時系列コレクションには、次のフィールドが含まれます。

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

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

timeseries.metaField
string

任意。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、一意の時系列ドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータを変更する必要はめったにありません。指定されたフィールドの名前を _id または timeseries.timeField と同じ名前にはできません。フィールドは任意のデータ型に指定できます。

metaFieldフィールドは任意ですが、メタデータを使用するとクエリの最適化が向上します。 たとえば、MongoDB metaFieldtimeFieldは新しいコレクションの フィールドと フィールドに 複合インデックス を自動的に作成します 。このフィールドに値を指定しない場合、データは時間のみに基づいてバケット化されます。

timeseries.granularity
integer

オプション。bucketRoundingSecondsbucketMaxSpanSecondsを設定する場合は使用しないでください。

可能な値はseconds (デフォルト)、minutes 、およびhoursです。

granularityを、連続する受信タイムスタンプ間の時間に最も近い値に設定します。これにより、MongoDB によるコレクションへのデータ保存方法が最適化され、パフォーマンスが向上します。

粒度とバケット間隔の詳細については、「時系列データの粒度の設定」を参照してください。

timeseries.bucketMaxSpanSeconds
integer

オプション。granularityの代替としてbucketRoundingSecondsと一緒に使用します。同じバケツ内のタイムスタンプ間の最大時間を設定する。

設定可能な値は 1~31536000 です。

バージョン 6.3 で追加

timeseries.bucketRoundingSeconds
integer

オプション。granularityの代替としてbucketMaxSpanSecondsと一緒に使用します。bucketMaxSpanSecondsと等しくなければなりません。

ドキュメントに新しいバケットが必要な場合、MongoDB ではドキュメントのタイムスタンプ値がこの間隔で切り捨てられ、バケットの最小時間が設定されます。

バージョン 6.3 で追加

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

時系列コレクション固有ではない、その他の許可されたオプションは次のとおりです。

  • 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
}

戻る

時系列