カーソルがサーバー上でタイムアウトしているため(10分間非アクティブになった後)、このエラーが発生します。
pymongoのドキュメントから:
MongoDBのカーソルは、操作を実行せずに長時間開いていると、サーバーでタイムアウトする可能性があります。これにより、カーソルを反復しようとしたときにCursorNotFound例外が発生する可能性があります。
collection.find
を呼び出すとき コレクションを照会し、ドキュメントにカーソルを返すメソッド。ドキュメントを取得するには、カーソルを繰り返します。カーソルを反復処理すると、ドライバーは実際にMongoDBサーバーに対して、サーバーからより多くのデータをフェッチするように要求します。各リクエストで返されるデータの量は、batch_size()
によって設定されます 方法。
ドキュメントから:
1つのバッチで返されるドキュメントの数を制限します。各バッチには、サーバーへのラウンドトリップが必要です。パフォーマンスを最適化し、データ転送を制限するように調整できます。
batch_sizeを低い値に設定すると、タイムアウトエラーエラーが発生しやすくなりますが、MongoDBサーバーにアクセスしてすべてのドキュメントを取得する回数が増えます。
デフォルトのバッチサイズ:
ほとんどのクエリでは、最初のバッチは101個のドキュメント、または1メガバイトを超えるのに十分なドキュメントを返します。バッチサイズは、BSONドキュメントの最大サイズ(16 MB)を超えることはありません。
普遍的な「正しい」バッチサイズはありません。さまざまな値でテストし、ユースケースに適した値、つまり10分間に処理できるドキュメントの数を確認する必要があります。
最後の手段は、no_cursor_timeout=True
を設定することです。 。ただし、データの処理が終了したら、カーソルが閉じていることを確認する必要があります。
try/except
なしでそれを回避する方法 :
cursor = collection.find(
{"x": 1},
no_cursor_timeout=True
)
for doc in cursor:
# do something with doc
cursor.close()