[解決済み] pymongo.errors.CursorNotFound: カーソルID '...' がサーバーで有効でない
質問
以下のコードで、mongoデータベースに存在するいくつかのidを取得しようとしています。
client = MongoClient('xx.xx.xx.xx', xxx)
db = client.test_database
db = client['...']
collection = db.test_collection
collection = db["..."]
for cursor in collection.find({ "$and" : [{ "followers" : { "$gt" : 2000 } }, { "followers" : { "$lt" : 3000 } }, { "list_followers" : { "$exists" : False } }] }):
print cursor['screenname']
print cursor['_id']['uid']
id = cursor['_id']['uid']
しかし、しばらくすると、このようなエラーが発生します。
pymongo.errors.CursorNotFound: カーソルID '...' がサーバで有効ではありません。
私はこれを見つけました
記事
を見つけたのですが、その問題に言及しています。しかし、どのような解決策をとればよいのか、私にはわかりません。 可能なのは
find().batch_size(30)
? 上記のコマンドは具体的に何をするのでしょうか?すべてのデータベースIDを
batch_size
?
どのように解決するのですか?
このエラーが発生するのは、サーバー上でカーソルがタイムアウトしているためです(10分間操作されなかった場合)。
pymongoのドキュメントより。
MongoDB のカーソルは、何も操作されずに長い間開いているとサーバー上でタイムアウトすることがあります。 がタイムアウトすることがあります。この場合 を実行しようとすると CursorNotFound 例外を発生します。 例外が発生します。
を呼び出すと
collection.find
メソッドを呼び出すと、コレクションに問い合わせが行われ、ドキュメントへのカーソルが返されます。ドキュメントを取得するには、このカーソルを繰り返し実行します。カーソルを反復するとき、ドライバは実際に MongoDB サーバーにリクエストを出し、サーバーからさらにデータを取得します。各リクエストで返されるデータの量は
batch_size()
メソッドで設定します。
から ドキュメント :
1つのバッチで返されるドキュメントの数を制限します。各バッチ はサーバへのラウンドトリップを必要とします。この値は、パフォーマンスを最適化し、データ転送を制限するために パフォーマンスを最適化し、データ転送を制限するために調整することができます。
batch_sizeを低い値に設定すると、タイムアウトエラーのエラーは改善されますが、すべてのドキュメントを取得するためにMongoDBサーバーにアクセスする回数が増えます。
デフォルトのバッチサイズです。
ほとんどのクエリでは、最初のバッチは 101 個のドキュメントを返します。 のドキュメントを返します。バッチ サイズが 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()
関連
-
[解決済み] mongo - サーバー 127.0.0.1:27017 に接続できませんでした。
-
[解決済み] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
-
[解決済み] 配列フィールドが空でない MongoDB レコードを検索する
-
[解決済み] 空ではないフォルダーを削除/消去するにはどうすればよいですか?
-
[解決済み] ユーザーが有効な応答を返すまで入力を求める
-
[解決済み】「datetime.datetime not JSON serializable」を克服する方法とは?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Django filter queryset __in for *every* item in list
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。