Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

cursor.maxTimeMS()

項目一覧

  • 定義
  • 動作
cursor.maxTimeMS(<time limit>)

重要

mongosh メソッド

このページでは、 mongosh メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません

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

カーソルに対する情報処理操作の累積時間制限をミリ秒単位で指定します。

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

db.collection.find(
{ <query> },
{ <projection> }
).maxTimeMS( <milliseconds> )

maxTimeMS()メソッドには次のパラメーターがあります。

Parameter
タイプ
説明
milliseconds
integer
カーソルに対する処理操作の累積時間制限をミリ秒単位で指定します。

重要

maxTimeMS() は、NoCursorTimeout クエリ フラグとは関係ありません。maxTimeMS() はプロセシング時間に関連し、 NoCursorTimeout はアイドル時間に関連します。カーソルのアイドル時間は、そのプロセシング時間には寄与しません。

maxAwaitTimeMS()メソッドは追尾可能 (tailable) カーソルが次の応答を待機する時間の制限を設定します。 合計処理時間に制限はありません。

MongoDB は、関連付けられたカーソルが割り当てられた時間制限を超えた場合に、操作を終了の対象とします。MongoDB は、db.killOp() と同じメカニズムを使用して、割り当てられた時間制限を超えた操作を終了します。MongoDB は、指定された割り込みポイントのいずれかでのみ操作を終了します。

MongoDB は、クライアントとサーバー間のレイテンシをカーソルの時間制限にカウントしません。ただし、シャーディングされたクラスターの場合、MongoDB は mongos インスタンスと mongod インスタンス間のレイテンシをこの時間制限に含めます。

複数の結果のバッチを生成するクエリは、カーソルが割り当てられた制限時間を超えるまでバッチを返し続けます。

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

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

たとえば、find() が 31 分のタイムアウトに設定された maxTimeMS() nの操作を検討しましょう。サーバーは、find() cursor.batchSize() で定義されたドキュメントのバッチとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチをリクエストするたびに更新されます。ただし、アプリケーションが現在のドキュメントバッチを処理するのに 30 分より長くかかる場合、セッションは期限切れとしてマークされ、終了します。サーバーがセッションを閉じると、カーソルは maxTimeMS() が 30 分より長く設定されているにもかかわらず、カーソルも強制終了されます。アプリケーションが次のドキュメントのバッチをリクエストすると、サーバーはエラーを返します。

カーソルを返す操作の場合、カーソルが 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.maxTimeMS() で設定されており、少なくとも 31 分間開いたままになります。while ループには、 refreshSessions を使用して 5 分ごとにセッションを更新するブロックが含まれています。セッションが 30 分のアイドル タイムアウトを超えることはないため、カーソルは設定された maxTimeMS() まで開いたままにできます。

MongoDB ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。

Tip

以下も参照してください。

MongoDB 8.0 以降では、defaultMaxTimeMS クラスターパラメータを使用して、個々の読み取り操作が完了するデフォルトの時間制限を指定できます。クエリで maxTimeMS() オプションが指定されている場合、その値は defaultMaxTimeMS の値を上書きします。

次のクエリでは、50 ミリ秒の時間制限を指定しています。

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)

戻る

cursor.maxAwaitTimeMS

項目一覧