上限付きコレクションのクエリ
ソート順序を指定せずに Capped コレクションをクエリすると、MongoDB は挿入された順序と同じ順序で結果を返します。つまり、最も古いドキュメントが最初に返されることを意味します。
コレクションから最後に挿入された要素を効率的に検索するには、 自然な順序付けを使用します。 この機能を用いると、ログファイルに対して tail
コマンドを使用するのと同様の結果が得られます。
このタスクについて
一般的に、 TTL(Time To Live)インデックスは、Cappedコレクションよりも優れたパフォーマンスと柔軟性を提供します。 TTL インデックスは期限切れとなり、日付型フィールドの値とインデックスの TTL 値に基づいて、通常のコレクションからデータを削除します。
Capped コレクションでは書込み操作がシリアル化されるため、それ以外のコレクションよりも同時挿入、更新、削除のパフォーマンスは低くなります。 Capped コレクションを作成する前に、TTL インデックスで代替できないかを検討しましょう。
複数の同時書込み(write)
Capped コレクションへの同時書込み(write)が存在する場合、MongoDB はドキュメントが挿入順で返されることを保証しません。
始める前に
2
サンプル データの挿入
db.log.insertMany( [ { message: "system start", type: "startup", time: 1711403508 }, { message: "user login attempt", type: "info", time: 1711403907 }, { message: "user login fail", type: "warning", time: 1711404209 }, { message: "user login success", type: "info", time: 1711404367 }, { message: "user logout", type: "info", time: 1711404555 } ] )
手順
次の例は、次の方法を示しています。
挿入順序でドキュメントを返す
log
コレクションで、 type
がinfo
であるドキュメントをクエリし、デフォルトの並べ替え順序を使用します。
db.log.find( { type: "info" } )
[ { _id: ObjectId("660204b74cabd75abebadbc2"), message: 'user login attempt', type: 'info', time: 1711403907 }, { _id: ObjectId("660204b74cabd75abebadbc4"), message: 'user login success', type: 'info', time: 1711404367 }, { _id: ObjectId("660204b74cabd75abebadbc5"), message: 'user logout', type: 'info', time: 1711404555 } ]
ドキュメントは、挿入された順序で返されます。
最新のドキュメントを返す
逆の挿入順序(最新ドキュメントが最初)でドキュメントを返すには、 パラメータをsort()
$natural
に設定して-1
メソッドを指定します。
次のクエリは、 log
コレクションから最新のドキュメントから始めて、3 つの最新のドキュメントを返します。
db.log.find().sort( { $natural: -1 } ).limit(3)
[ { _id: ObjectId("6601f2484cabd75abebadbbb"), message: 'user logout', type: 'info', time: 1711404555 }, { _id: ObjectId("6601f2484cabd75abebadbba"), message: 'user login success', type: 'info', time: 1711404367 }, { _id: ObjectId("6601f2484cabd75abebadbb9"), message: 'user login fail', type: 'warning', time: 1711404209 } ]