カーソルは、クエリの結果へのポインターです。カーソルを使用すると、一度に 1バッチするでデータベースの結果を反復処理できます。
ユースケース
mongosh
または ドライバー を使用して find()
メソッドと aggregate()
メソッドを実行すると、結果のバッチを含むカーソルが返されます。結果のドキュメントには、カーソルを手動で反復処理するか、toArray()
メソッドを使用してアクセスできます。詳細については、「mongosh
でのカーソルの反復」を参照してください。
Cappedコレクションにアクセスしている場合は、コレクションに挿入されるときに新しいドキュメントを検索する追尾可能 (tailable) カーソルを使用できます。詳細については、「 追尾可能 (tailable) カーソル 」を参照してください。
動作
クライアントセッション内で作成されたカーソルは、次のシナリオでは閉じられます。
クライアントはカーソルを使い果たします。
ユーザーがカーソルを手動で閉じます。
ユーザーがセッションを手動で終了した。
セッションがタイムアウトした。
cursorTimeoutMillis
パラメータはアイドル10 カーソルのタイムアウトを指定し、デフォルト値は 分です。 MongoDB は、このしきい値の経過後に、セッション外で作成されたアイドル カーソルをタイムアウトします。 MongoDB は、カーソルが新しいバッチするを返すたびにカーソルのタイムアウトを延長します。カーソルを手動で閉じるには、killCursors
を使用します。
サーバーセッション タイムアウトは localLogicalSessionTimeoutMinutes
パラメータによって指定され、デフォルト値は 30 分です。30 分を超えてセッションを延長するには、refreshSessions
を使用します。セッションを手動で終了するには、killSessions
を使用します。
カーソルがセッション外で開かれている場合、 MongoDBドライバーと mongosh
は暗黙的なセッションを作成し、それを操作に関連付けます。
カーソル使用中の同時更新
カーソルによってドキュメントが返されると、読み取り保証 (read concern)のレベルによっては、バックグラウンドで他の操作が実行され、結果に影響が出る可能性があります。 詳細については、「 読み取り分離、整合性、最新性について 」を参照してください。
はじめる
詳細
find
または aggregate
操作を実行すると、データベースはバッチするを満たすのに十分なドキュメントを見つけるまでクエリを実行します。バッチするが入力されると、クエリは一時停止します。サーバー上で一時停止されたクエリは カーソル と呼ばれ、一時停止されたクエリに関連付けられたID はカーソルIDと呼ばれます。
データベースは、結果のバッチするとカーソルID をクライアントに返します。MongoDBドライバーと mongosh
はこのデータをクライアント側のカーソルインスタンスに保存します。バッチするの末尾に到達したときに一致するドキュメントがさらにある場合、クライアント側のカーソルは getMore
を使用してサーバーから自動的に次のバッチするを取得します。現在のバッチするに残っている結果数を確認するには、cursor.objsLeftInBatch()
を使用します。現在のバッチするまたはサーバー上に結果が残っているかどうかを確認するには、cursor.hasNext()
を使用します。
カーソル バッチ
カーソル は結果をバッチで返します。バッチする内のデータ量は、最大BSONドキュメントサイズ(16 MiB)より小さくなければなりません。バッチするで許可されるドキュメントの最大数を指定するには、cursor.batchSize()
を参照してください。デフォルトでは、find()
操作と aggregate()
操作のバッチするサイズは 101
です。結果のカーソルに対して発行される後続の getMore
操作には、デフォルトのバッチするサイズがないため、16 メビバイトのメッセージ サイズによってのみ制限されます。
ソート
インデックスなしでソート操作を行うクエリでは、サーバーは結果を返す前にすべてのドキュメントをメモリにロードしてソートを実行する必要があります。
カーソル情報
db.serverStatus()
メソッドは、metrics
フィールドを含むドキュメントを返します。metrics
フィールドには、詳細なカーソル情報を含む metrics.cursor
フィールドが含まれています。詳しくは metrics.cursor
を参照してください。