Docs Menu
Docs Home
/
MongoDBマニュアル

時系列コレクション

項目一覧

  • 時系列コレクション
  • 手順
  • 動作

バージョン 5.0 で追加

時系列コレクションは一定期間にわたる測定値のシーケンスを効率的に保存します。 時系列データとは、一定時間にわたって収集され、1 つ以上の変更されていないパラメーターによって一意に識別される任意のデータです。 時系列データを識別する変更不可のパラメーターは、通常、データソースのメタデータです。

測定値
Metadata
気象データ
温度
センサー識別子、ロケーション
株価データ
株価
株式ティッカー、取引所
ウェブサイトの訪問者
閲覧数
URL

バージョン 5.0 で追加

時系列コレクションは時系列データを効率的にストアします。時系列コレクションでは、同じソースから収集されたデータが、ほぼ同じ時点のデータ ポイントと一緒にストアされるよう、書込みが整理されます。

MongoDB Atlas でホストされている配置向け に UI で時系列コレクションを 作成 できます。

時系列データを時系列コレクションにストアすると、通常のコレクションと比較して、クエリの効率が向上し、時系列データやセカンダリ インデックスのディスク使用量が削減されます。

注意

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

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

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

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

フィールド
タイプ
説明
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

次を参照してください。

警告

MongoDB サーバーがクラッシュするため、 system.profileという名前の時系列コレクションまたはビューを作成しないでください。

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

時系列コレクションから 1 つのドキュメントを検索するには、次のコマンドを発行します。

db.weather.findOne({
"timestamp": ISODate("2021-05-18T00:00:00.000Z")
})

その他のクエリ機能については、次のような集計パイプラインを使用してください。

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
}

コレクションがタイプ時系列であるかどうかを確認するには、 listCollectionsコマンドを使用します。

db.runCommand( { listCollections: 1.0 } )

コレクションが時系列コレクションの場合、これが返されます。

{
cursor: {
id: <number>,
ns: 'test.$cmd.listCollections',
firstBatch: [
{
name: <string>,
type: 'timeseries',
options: {
expireAfterSeconds: <number>,
timeseries: { ... }
},
...
},
...
]
}
}

時系列コレクションは、通常のコレクションと同様に動作します。 通常どおり、データの挿入とクエリができます。 MongoDB では、時系列コレクションは、挿入時に時系列データを最適化されたストレージ形式に自動的に整理する内部コレクションに対する書込み可能な非マテリアライズド ビュー として扱われます。

時系列コレクションをクエリする場合、1 回の測定ごとに 1 つのドキュメントに対して操作します。 時系列コレクションに対するクエリでは、最適化された内部ストレージ形式を活用して、結果がより速く返されます。

Tip

クエリのパフォーマンスを向上させるために、 metaFieldtimeFieldとして指定されたフィールドに セカンダリ インデックス を手動で追加できます。

時系列コレクションは、データを時間順に自動的に順序付け、インデックスを作成します。 時系列コレクションの内部インデックスはlistIndexesでは表示されません。

1970-01-01T00:00:00.000Zの前または2038-01-19T03:14:07.000Zの後にtimeField値を持つドキュメントをコレクションに挿入すると、MongoDB は警告をログに記録し、一部のクエリ最適化で内部インデックスを使用できなくなります。 クエリ パフォーマンスを回復し、ログ警告を解決するには、 timeFieldセカンダリ インデックスを作成します。

時系列コレクションは、コレクションの作成時にstorageEngineオプションを使用して別の圧縮アルゴリズムが指定されていない限り、グローバルデフォルト圧縮アルゴリズムであるsnappyを無視し、 zstdを優先します。 たとえば、新しいweatherコレクションの圧縮アルゴリズムをsnappyに変更するには、次のオプションを追加します。

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp"
},
storageEngine: {
wiredTiger: {
configString: "block_compressor=snappy"
}
}
}
)

有効なblock_compressorオプションは次のとおりです。

  • snappy

  • zlib

  • zstd (デフォルト)

  • none

戻る

上限付きコレクション