上限付きコレクション
Overview
Capped コレクションとは、挿入順序に基づいてドキュメントを挿入、取得する高スループット操作をサポートする固定サイズのコレクションです。 機能方法は循環バッファと同様で、コレクションの割り当て領域に達すると、内部の最も古いドキュメントを上書きすることで、新しいドキュメントに空き領域が作成されます。
Capped コレクションの作成の詳細については、 createCollection()
またはcreate
を参照してください。
Tip
Capped コレクションの代替として、MongoDB のTTL(Time To Live)インデックス を検討してください。 「 TTL を設定してコレクションのデータを期限切れにする 」で説明されているように、これらのインデックスを使用すると、日付型フィールドの値とインデックスの TTL 値に基づいて、通常のコレクションからデータを期限切れにして削除できます。
TTL インデックスは Capped コレクションと互換性がありません。 コレクションにインデックスを作成することはできますが、 mongod
は期限切れのドキュメントを削除しません。
動作
挿入順序
Capped コレクションは、挿入順序の保持を保証します。 その結果、クエリでは、挿入順序でドキュメントを返すためにインデックスは必要ありません。 このインデックス オーバーヘッドがない場合、Capped コレクションはより高い挿入スループットをサポートできます。
最も古いドキュメントの自動削除
新しいドキュメントの空き領域を作成するために、Capped コレクションでは、スクリプトや明示的な削除操作なしで、コレクション内の最も古いドキュメントが自動的に削除されます。
Capped コレクションの次の潜在的なユースケースを考慮してください。
大規模なシステムによって生成されたログ情報を保存します。 インデックスなしで Capped コレクションにドキュメントを挿入すると、ログ情報をファイル システムに直接書き込む速度に近くなります。 さらに、組み込みの先入れ先出しプロパティは、ストレージの使用を管理しながら、イベントの順序を維持します。
Capped コレクションで少数のデータをキャッシュします。 キャッシュは書き込みが多いのではなく読み取りであるため、このコレクションが常にワーキングセット(RAM)内に存在するようにするか、必要なインデックスに対してある程度の書込みペナルティを受け入れる必要があります。
たとえば、レプリカセットに 操作のログを保存する レプリカoplog セット は、Cappedコレクションを使用します。他の Cappedコレクションとは異なり、oplogは設定されたサイズ制限を超えて拡大することができ、 majority
commit point
が削除されるのを回避します。
_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
フィールドが4096未満の場合、コレクションの上限は4096バイトになります。 それ以外の場合、MongoDB は指定されたサイズを引き上げて、 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
パラメーターは、上限付きコレクションのサイズをバイト単位で指定します。
これにより、操作中はデータベースの排他ロックが保持されます。同じデータベースをロックする他の操作は、操作が完了するまでブロックされます。データベースをロックする操作の場合、「一般的なクライアント操作によって取得されるロック」を参照してください。
追尾可能 (tailable) カーソル
上限付きコレクションでは、追尾可能 (tailable) カーソルを使用できます。Unix tail -f
コマンドと同様に、追尾可能 (tailable) カーソルは、上限付きコレクションの最後に「追尾」します。新しいドキュメントが上限付きコレクションに挿入されたら、追尾可能 (tailable) カーソルを使用してドキュメントの検索を続行できます。
追尾可能 (tailable) カーソルの作成の詳細については、「 追尾可能 (tailable) カーソル 」を参照してください。