上限付きコレクション
項目一覧
Overview
Capped コレクションとは、挿入順序に基づいてドキュメントを挿入、取得する高スループット操作をサポートする固定サイズのコレクションです。 機能方法は循環バッファと同様で、コレクションの割り当て領域に達すると、内部の最も古いドキュメントを上書きすることで、新しいドキュメントに空き領域が作成されます。
Capped コレクションの作成の詳細については、 createCollection()
またはcreate
を参照してください。
Tip
Capped コレクションの代替として、MongoDB のTTL(Time To Live)インデックス を検討してください。 「 TTL を設定してコレクションのデータを期限切れにする 」で説明されているように、これらのインデックスを使用すると、日付型フィールドの値とインデックスの TTL 値に基づいて、通常のコレクションからデータを期限切れにして削除できます。
TTL インデックスは Capped コレクションと互換性がありません。
動作
挿入順序
Capped コレクションは、挿入順序の保持を保証します。 その結果、クエリでは、挿入順序でドキュメントを返すためにインデックスは必要ありません。 このインデックス オーバーヘッドがない場合、Capped コレクションはより高い挿入スループットをサポートできます。
最も古いドキュメントの自動削除
新しいドキュメントの空き領域を作成するために、Capped コレクションでは、スクリプトや明示的な削除操作なしで、コレクション内の最も古いドキュメントが自動的に削除されます。
Capped コレクションの次の潜在的なユースケースを考慮してください。
大規模なシステムによって生成されたログ情報を保存します。 Inserting documents in a capped collection without an index is close to the speed of writing log information directly to a file system. さらに、組み込みの先入れ先出しプロパティは、ストレージの使用を管理しながら、イベントの順序を維持します。 For example, the oplog uses a capped collection.
Capped コレクションで少数のデータをキャッシュします。 キャッシュは書き込みが多いのではなく読み取りであるため、このコレクションが常にワーキングセット(RAM)内に存在するようにするか、必要なインデックスに対してある程度の書込みペナルティを受け入れる必要があります。
Oplog コレクション
操作のログをレプリカセットにストアする oplog.rs コレクションには、上限付きコレクションが使われます。
MongoDB 4.0 以降では、他の Cappedコレクションとは異なり、oplog は設定されたサイズ制限を超えて拡大することができ、 majority
commit point
が削除されるのを回避します。
注意
MongoDB では、oplog の上限サイズを、256 の倍数の最も近い整数に切り上げます(単位はバイト)。
_id
Index
上限付きコレクションには、デフォルトで _id
フィールドと _id
フィールドにインデックスがあります。
制限と推奨事項
読み取り
MongoDB 5.0 以降では、上限付きコレクションから読み取るときに読み取り保証 (read concern) "snapshot"
を使用できません。
Updates
Capped コレクション内のドキュメントを更新する場合は、インデックスを作成して、これらの更新操作にコレクションスキャンが必要なくなります。
シャーディング
Capped コレクションはシャーディングできません。
クエリ効率
コレクションから最後に挿入された要素を効率的に検索するには、 自然な順序付け 機能を使用します。 この機能を用いると、ログファイルに対してtail
コマンドを使用するのと同様の結果が得られます。
集計 $out
集計パイプライン ステージ$out
は Capped コレクションに結果を書き込めません。
トランザクション
トランザクション では Capped コレクションへの書込み(write)はできません。
Stable API
上限付きコレクションは、Stable API V1 でサポートされていません。
手順
上限付きコレクションの作成
db.createCollection()
上限付きコレクションは、 コマンドのmongosh
ヘルパーであるcreate
メソッドを使用して明示的に作成する必要があります。Capped コレクションを作成するときは、コレクションの最大サイズをバイト単位で指定する必要があります。このサイズは MongoDB によってコレクションに事前に割り当てられます。 Capped コレクションのサイズには、内部オーバーヘッド用のスペースが含まれます。
db.createCollection( "log", { capped: true, size: 100000 } )
注意
size
フィールドに指定する値は、 0
より大きく、 1024^5
(1 PB )以下である必要があります。 MongoDB は、すべての Cappedコレクションのsize
を、256 の倍数の最も近い整数に切り上げます(バイト単位)。
さらに、次のドキュメントのように、 max
フィールドを使用してコレクションのドキュメントの最大数を指定することもできます。
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
重要
ドキュメントの数を指定した場合でも、 max
size
引数は常に必要です。 MongoDB は、コレクションが最大ドキュメント数に達する前に最大サイズ制限に達した場合、古いドキュメントを排除します。
上限付きコレクションのクエリ
順序が指定されていない Capped コレクションでfind()
を実行すると、MongoDB は結果の順序が挿入順序と同じであることを保証します。
逆の挿入順序でドキュメントを検索するには、次の例に示すように、 パラメータを に設定して、 と メソッドを発行します。find()
sort()
$natural
-1
db.cappedCollection.find().sort( { $natural: -1 } )
コレクションに上限が設けられているかどうかを確認する
コレクションが上限付きかどうかは、次のようにisCapped()
メソッドを使用して判断します。
db.collection.isCapped()
コレクションを上限付きに変換する
convertToCapped
コマンドを使用して、Capped 以外のコレクションを Capped コレクションに変換できます。
db.runCommand({"convertToCapped": "mycoll", size: 100000});
size
パラメーターは、上限付きコレクションのサイズをバイト単位で指定します。
これにより、操作中はデータベースの排他ロックが保持されます。同じデータベースをロックする他の操作は、操作が完了するまでブロックされます。データベースをロックする操作の場合、「一般的なクライアント操作によって取得されるロック」を参照してください。
Capped コレクションのサイズの変更
バージョン 6.0 で追加。
collMod
コマンドのcappedSize
オプションを使用して、上限付きコレクションのサイズを変更して、 cappedSize
をバイト単位で設定します。 cappedSize
は0
より大きく、 1024^5
(1 PB )以下である必要があります。
注意
上限付きコレクションのサイズを変更する前に、 featureCompatibilityVersionを少なくともバージョン"6.0"
にすでに設定している必要があります。
たとえば、次のコマンドは、 "log"
の上限付きコレクション の最大サイズを 100000 バイトに設定します。
db.runCommand( { collMod: "log", cappedSize: 100000 } )
Capped コレクション内の最大ドキュメント数の変更
バージョン 6.0 で追加。
上限付きコレクション内のドキュメントの最大数を変更するには、 collMod
コマンドのcappedMax
オプションを使用します。 cappedMax
が0
未満の場合、ドキュメント数の上限はありません。 cappedMax
がコレクション内の現在のドキュメント数より小さい場合、MongoDB は次回の挿入操作で超過ドキュメントを削除します。
たとえば、次のコマンドは、 "log"
の上限付きコレクション内のドキュメントの最大数を 500 に設定します。
db.runCommand( { collMod: "log", cappedMax: 500 } )
追尾可能 (tailable) カーソル
上限付きコレクションでは、追尾可能 (tailable) カーソルを使用できます。Unix tail -f
コマンドと同様に、追尾可能 (tailable) カーソルは、上限付きコレクションの最後に「追尾」します。新しいドキュメントが上限付きコレクションに挿入されたら、追尾可能 (tailable) カーソルを使用してドキュメントの検索を続行できます。
追尾可能 (tailable) カーソルの作成の詳細については、「 追尾可能 (tailable) カーソル 」を参照してください。