時系列コレクションの制限
項目一覧
時系列コレクションは通常、一般的なコレクションと同様に動作しますが、いくつかの制限があります。
サポートされていない機能
MongoDB は、時系列コレクションで次の機能をサポートしていません。
集計 $merge
$merge
集計ステージを使用して、別のコレクションのデータを時系列コレクションに追加することはできません。$out
集計ステージを使用して、時系列コレクションにドキュメントを書き込んでください。
$merge
を使用して、時系列コレクションから別のコレクションにデータを移動できます。
distinct コマンド
時系列コレクションは一意のデータ構造であるため、MongoDB は個別の値に対して効率的にインデックスを作成できません。時系列コレクションで distinct
コマンドまたは db.collection.distinct()
ヘルパーメソッドを使用しないでください。代わりに、$group
集計を使用して、ドキュメントを個別の値でグループ化します。
たとえば、meta.project = 10
であるドキュメントに対して meta.type
の値を個別でクエリするには、次のようにします。
db.foo.distinct("meta.type", {"meta.project": 10})
次を使用します。
db.foo.createIndex({"meta.project":1, "meta.type":1}) db.foo.aggregate([{$match: {"meta.project": 10}}, {$group: {_id: "$meta.type"}}])
これは、次のように機能します。
地理空間クエリ
時系列コレクションは、2dsphere インデックスに対するクエリからの地理空間データをソートするための $geoNear
集計ステージのみをサポートします。時系列コレクションでは、$near
と $nearSphere
演算子は使用できません
ドキュメントのサイズ
時系列コレクション内のドキュメントの最大サイズは 4 MB です。
拡張された日付範囲
1970-01-01T00:00:00.000Z
の前または 2038-01-19T03:14:07.000Z
の後に timeField
タイムスタンプがあるドキュメントが時系列コレクションに含まれる場合、TTL(time to live) 機能によってコレクションからドキュメントが削除されることはありません。
TTL 削除の詳細については、「TTL を設定してコレクションのデータを期限切れにする」を参照してください。
時系列コレクションに 1970-01-01T00:00:00.000Z
の前または 2038-01-19T03:14:07.000Z
の後に timeField
タイムスタンプが付いたドキュメントが含まれている場合は、timeField
にインデックスを作成してクエリを最適化してください。
Updates
更新コマンドは、次の要件を満たしている必要があります。
照合できるのは、
metaField
フィールドの値のみです。変更できるのは、
metaField
フィールドの値のみです。更新ドキュメントには、更新演算子式しか含めることができません。
更新コマンドでは、更新されるドキュメント数を制限せず、
multi: true
を設定するか、updateMany()
メソッドを使用します。更新コマンドでは upsert: true を設定しないでください。
古いデータを自動的に削除するには、自動削除(TTL)を設定します。
時系列セカンダリインデックス
MongoDB は、時系列コレクションの次のインデックスを部分的にサポートしています。
マルチキー インデックスは
metaField
でのみ作成できます。metaField
では 2d インデックスのみ作成できる。metaField
はスパース インデックスのみを作成できます。
MongoDB は、時系列コレクションで次のインデックスタイプをサポートしていません。
時系列コレクションにセカンダリインデックスがあり、機能の互換性バージョン(fCV)をダウングレードする必要がある場合は、ダウングレードした fCV と互換性のないセカンダリインデックスを最初に削除する必要があります。詳細については、setFeatureCompatibilityVersion
を参照してください。
上限付きコレクション
時系列コレクションを 上限付きコレクションとして作成することはできません。
コレクション タイプの変更
コレクションを作成するときにのみコレクション タイプを設定できます。
既存のコレクションを時系列コレクションに変換することはできない。
時系列コレクションを別のコレクションタイプに変換することはできない。
既存のコレクションから時系列コレクションにデータを移動するには、データを時系列コレクションに移行します。
timeField
と metaField
の変更
コレクションを作成するときにのみ、コレクションの timeField
パラメーターと metaField
パラメーターを設定できます。これらのパラメーターを後で変更することはできません。
粒度
バケット サイズ
どの粒度パラメーターの設定でも、バケットの最大サイズは 1000 回の測定値または 125 KB のデータ量のうち、どちらか小さい方です。MongoDB では、ワーキングセットのバケットが WiredTiger キャッシュに収まるように、多数のユニークな値を持つ高濃度データに対しては、最大サイズを小さくすることもできます。
バケット パラメータの変更
コレクションの granularity
またはカスタムバケットパラメーターの bucketMaxSpanSeconds
と bucketRoundingSeconds
を設定すると、バケットの対象となるタイムスパンを増やすことはできますが、減らすことはできません。パラメーターを変更するには、collMod
コマンドを使用します。以下に例を挙げます。
db.runCommand({ collMod: "timeseries", timeseries: { bucketMaxSpanSeconds: 3600, bucketRoundingSeconds: 3600 } })
注意
bucketMaxSpanSeconds
と bucketRoundingSeconds
は等しくなければなりません。1 つのパラメーターを変更する場合は、他のパラメーターも同じ値に設定する必要があります。
シャーディング
時系列コレクションには、いくつかのシャーディングの制限があります。
シャーディング管理コマンド
シャーディングされた時系列コレクションでは、シャーディング管理コマンドを実行できません。
シャードキー フィールド
時系列コレクションをシャーディングする場合、シャードキーで指定できるのは次のフィールドのみです。
この
metaField
サブフィールド
metaField
この
timeField
シャードキーでこれらのフィールドの組み合わせを指定できます。シャードキーのパターンでは、_id
を含む他のフィールドは許可されません。
シャードキーを指定する場合には、次のいずれかです。
metaField
またはtimeField
でなければなりません:シャードキーのパターン末尾
Tip
timeField
だけをシャードキーとして指定することは避けてください。timeField
は単調に増加するため、すべての書き込みがクラスター内の 1 つのチャンクで発生することがあります。理想的には、データをチャンク間で均等に分散します。
シャードキーを最適に選択する方法については、以下を参照してください。
MongoDB 8.0 以降、時系列コレクションでシャードキーとして timeField
を使用することは非推奨になります。
再シャーディング
シャーディングされた時系列コレクションを再シャーディングすることはできません。 ただし、そのシャードキーは変更できます。
トランザクション
トランザクションの時系列コレクションに書き込むことはできません。
注意
MongoDB は、トランザクション内の時系列コレクションからの読み取りをサポートしています。
ビュー
時系列コレクションは、書き込み可能な非マテリアライズドビューです。ビューの制限は、時系列コレクションに適用されます。
時系列バケットコレクションの名前空間(つまり、
system.buckets
というプレフィックスが付いたコレクション)からビューを作成することはできません。
スナップショットの分離
読み取り保証"snapshot"
を使用した時系列コレクションの読み取り操作は、読み取り操作内にコレクションに対する同時削除操作または名前変更操作がない場合にのみスナップショットの分離を保証します。 別の粒度設定を使用して同じ名前空間に時系列コレクションを再作成しても、完全なスナップショット分離は生成されません。