cursor.noCursorTimeout()
定義
cursor.noCursorTimeout()
重要
mongosh メソッド
このページでは、
mongosh
メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
非アクティブな状態が一定期間続いた後、カーソルを自動的に閉じないようサーバーへ指示します。
noCursorTimeout()
メソッドのプロトタイプ形式は次のとおりです。db.collection.find(<query>).noCursorTimeout()
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M 0 、M 2 、M 5クラスターではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
動作
セッション アイドル タイムアウトの上書き 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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。