sql >> データベース >  >> NoSQL >> MongoDB

pymongo.errors.CursorNotFound:カーソルID'...'はサーバーで無効です

    カーソルがサーバー上でタイムアウトしているため(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()
    


    1. Redisで有効期限を複数のキーに設定する方法

    2. 高速書き込みの一時的な行ストレージソリューションのためのMongoDB対Redis対Cassandra

    3. SpringDataRedisの有効期限キー

    4. cURLを悪用してRedisと通信する