定義
cursor.noCursorTimeout()重要
mongosh メソッド
このページでは メソッドについて説明します。これはNode.jsなどの言語固有のドライバーのドキュメントではありません
mongosh。MongoDB API ドライバーについては、各言語の「MongoDB ドライバーのドキュメント」を参照してください。
非アクティブな状態が一定期間続いた後、カーソルを自動的に閉じないようサーバーへ指示します。
noCursorTimeout()メソッドのプロトタイプ形式は次のとおりです。db.collection.find(<query>).noCursorTimeout()
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
重要
このコマンドは、M0 および Flex クラスターではサポートされていません。詳細については、サポートされていないコマンド を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
動作
セッション アイドル タイムアウトの上書き noCursorTimeout
MongoDBドライバーとmongosh は、確認されていない書込み操作を除くすべての操作をサーバーセッションに関連付けます。セッションに明示的に関連付けられていない操作(つまり を使用するもの)の場合、Mongo.startSession() MongoDBドライバーとmongosh は暗黙的なセッションを作成し、それが操作に関連付けられます。
セッションが30 分以上アイドル状態になると、 MongoDBサーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。 MongoDBサーバーがセッションを閉じると、セッションに関連付けられている進行中の操作と開いているカーソルもすべて強制終了されます。これには、noCursorTimeout() maxTimeMS()または30 分を超える で構成されたカーソルが含まれます。
db.collection.find()でcursor.noCursorTimeout() を発行するアプリケーションを検討しましょう。サーバーは、cursor.batchSize() のfind() によって定義されたドキュメントのバッチするとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチするを要求するたびに更新されます。ただし、アプリケーションが現在のドキュメントのバッチする処理に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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。