Anda mendapatkan kesalahan ini karena waktu kursor habis di server (setelah 10 menit tidak aktif).
Dari dokumentasi pymongo:
Kursor di MongoDB dapat habis waktu di server jika sudah lama terbuka tanpa operasi apa pun yang dilakukan pada mereka. Hal ini dapat menyebabkan pengecualian CursorNotFound dimunculkan saat mencoba melakukan pengulangan kursor.
Saat Anda memanggil collection.find
metode itu menanyakan koleksi dan mengembalikan kursor ke dokumen. Untuk mendapatkan dokumen, Anda mengulangi kursor. Saat Anda mengulangi kursor, driver sebenarnya membuat permintaan ke server MongoDB untuk mengambil lebih banyak data dari server. Jumlah data yang dikembalikan dalam setiap permintaan diatur oleh batch_size()
metode.
Dari dokumentasi:
Membatasi jumlah dokumen yang dikembalikan dalam satu batch. Setiap batch memerlukan perjalanan pulang pergi ke server. Ini dapat disesuaikan untuk mengoptimalkan kinerja dan membatasi transfer data.
Menyetel batch_size ke nilai yang lebih rendah akan membantu Anda mengatasi error error timeout, tetapi akan meningkatkan frekuensi akses server MongoDB untuk mendapatkan semua dokumen.
Ukuran kumpulan default:
Untuk sebagian besar kueri, kumpulan pertama mengembalikan 101 dokumen atau dokumen yang cukup untuk melebihi 1 megabita. Ukuran batch tidak akan melebihi ukuran dokumen BSON maksimum (16 MB).
Tidak ada ukuran batch "benar" yang universal. Anda harus menguji dengan nilai yang berbeda dan melihat nilai yang sesuai untuk kasus penggunaan Anda, yaitu berapa banyak dokumen yang dapat Anda proses dalam waktu 10 menit.
Pilihan terakhir adalah Anda menyetel no_cursor_timeout=True
. Tetapi Anda perlu memastikan bahwa kursor ditutup setelah Anda selesai memproses data.
Bagaimana menghindarinya tanpa try/except
:
cursor = collection.find(
{"x": 1},
no_cursor_timeout=True
)
for doc in cursor:
# do something with doc
cursor.close()