cursor.noCursorTimeout()
定義
cursor.noCursorTimeout()
重要
mongosh メソッド
これは
mongosh
メソッドです。 これは、Node.js
またはその他のプログラミング言語固有のドライバー メソッドのドキュメントではありません。ほとんどの場合、
mongosh
メソッドはレガシーのmongo
shell メソッドと同じように動作します。 ただし、一部のレガシー メソッドはmongosh
では利用できません。レガシー
mongo
shell のドキュメントについては、対応する MongoDB Server リリースのドキュメントを参照してください。MongoDB API ドライバーについては、各言語のMongoDB ドライバードキュメント を参照してください。
非アクティブな状態が一定期間続いた後、カーソルを自動的に閉じないようサーバーへ指示します。
noCursorTimeout()
メソッドのプロトタイプ形式は次のとおりです。db.collection.find(<query>).noCursorTimeout()
動作
セッション アイドル タイムアウトの上書き noCursorTimeout
MongoDB ドライバーとmongosh
では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()
を使用するもの)の場合、MongoDB ドライバーとmongosh
によって暗黙的なセッションが作成され、それが操作に関連付けられます。
セッションが 30 分以上アイドル状態の場合、MongoDB サーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。MongoDB サーバーがセッションを閉じると、セッションに関連付けられている進行中の操作と開いているカーソルもすべて強制終了されます。これには、noCursorTimeout()
または 30 分を超える maxTimeMS()
で構成されたカーソルが含まれます。
db.collection.find()
で cursor.noCursorTimeout()
を発行するアプリケーションを検討しましょう。サーバーは、find()
の cursor.batchSize()
によって定義されたドキュメントのバッチとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチをリクエストするたびに更新されます。ただし、アプリケーションが現在のドキュメントのバッチ処理に 30 分以上かかる場合には、セッションは期限切れとしてマークされ、閉じます。サーバーがセッションを閉じると、カーソルが noCursorTimeout()
で設定されていたとしても、カーソルも強制終了されます。アプリケーションが次のドキュメントのバッチをリクエストすると、サーバーはエラーを返します。
カーソルの更新 refreshSessions
カーソルを返す操作の場合、カーソルが 30 分以上アイドル状態になる可能性がある場合は、 Mongo.startSession()
を使用して明示的なセッション内で操作を発行し、 refreshSessions
コマンドを使用して定期的にセッションを更新します。以下がその例です。
var session = db.getMongo().startSession() var sessionId = session sessionId // show the sessionId var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout() var refreshTimestamp = new Date() // take note of time at operation start while (cursor.hasNext()) { // Check if more than 5 minutes have passed since the last refresh if ( (new Date()-refreshTimestamp)/1000 > 300 ) { print("refreshing session") db.adminCommand({"refreshSessions" : [sessionId]}) refreshTimestamp = new Date() } // process cursor normally }
この例の操作では、 db.collection.find()
メソッドは明示的なセッションに関連付けられています。カーソルは、アイドル状態の場合にサーバーがカーソルを閉じないように cursor.noCursorTimeout()
で構成されています。while
ループには、refreshSessions
を使用して 5 分ごとにセッションを更新するブロックが含まれています。セッションが 30 分間のアイドルタイムアウトを超えることはないため、カーソルは無期限に開いたままになります。
MongoDB ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。