ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

cursor.noCursorTimeout()

cursor.noCursorTimeout()

重要

mongosh メソッド

このページでは、mongosh メソッドについて記載しています。これは Node.js などの言語固有のドライバーのドキュメントではありません

MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。

非アクティブな状態が一定期間続いた後、カーソルを自動的に閉じないようサーバーへ指示します。

noCursorTimeout() メソッドのプロトタイプ形式は次のとおりです。

db.collection.find(<query>).noCursorTimeout()

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

重要

このコマンドは、M0、M2、M5、および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

MongoDB ドライバーとmongosh では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()を使用するもの)の場合、MongoDB ドライバーとmongoshによって暗黙的なセッションが作成され、それが操作に関連付けられます。

セッションが 30 分以上アイドル状態の場合、MongoDB サーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。MongoDB サーバーがセッションを閉じると、セッションに関連付けられている進行中の操作と開いているカーソルもすべて強制終了されます。これには、noCursorTimeout() または 30 分を超える maxTimeMS() で構成されたカーソルが含まれます。

db.collection.find()cursor.noCursorTimeout() を発行するアプリケーションを検討しましょう。サーバーは、find()cursor.batchSize() によって定義されたドキュメントのバッチとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチをリクエストするたびに更新されます。ただし、アプリケーションが現在のドキュメントのバッチ処理に 30 分以上かかる場合には、セッションは期限切れとしてマークされ、閉じます。サーバーがセッションを閉じると、カーソルが noCursorTimeout() で設定されていたとしても、カーソルも強制終了されます。アプリケーションが次のドキュメントのバッチをリクエストすると、サーバーはエラーを返します。

カーソルを返す操作の場合、カーソルが 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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。