आपको यह त्रुटि इसलिए मिल रही है क्योंकि सर्वर पर कर्सर का समय समाप्त हो रहा है (10 मिनट की निष्क्रियता के बाद)।
पाइमोंगो दस्तावेज़ से:
<ब्लॉकक्वॉट>MongoDB में कर्सर सर्वर पर टाइमआउट कर सकते हैं यदि वे लंबे समय से बिना किसी ऑपरेशन के खुले हैं। यह कर्सर को पुनरावृत्त करने का प्रयास करते समय एक CursorNotFound अपवाद उत्पन्न कर सकता है।
जब आप collection.find
पर कॉल करते हैं विधि यह एक संग्रह से पूछताछ करती है और यह दस्तावेज़ों पर एक कर्सर लौटाती है। दस्तावेज़ प्राप्त करने के लिए आप कर्सर को पुनरावृत्त करते हैं। जब आप कर्सर पर पुनरावृति करते हैं तो ड्राइवर वास्तव में सर्वर से अधिक डेटा लाने के लिए MongoDB सर्वर से अनुरोध कर रहा होता है। प्रत्येक अनुरोध में लौटाए गए डेटा की मात्रा batch_size()
. द्वारा निर्धारित की जाती है तरीका।
दस्तावेज़ीकरण से:
<ब्लॉकक्वॉट>एक बैच में लौटाए गए दस्तावेज़ों की संख्या को सीमित करता है। प्रत्येक बैच को सर्वर के लिए एक राउंड ट्रिप की आवश्यकता होती है। इसे प्रदर्शन को अनुकूलित करने और डेटा स्थानांतरण को सीमित करने के लिए समायोजित किया जा सकता है।
बैच_साइज़ को कम मान पर सेट करने से आपको टाइमआउट त्रुटियों त्रुटियों में मदद मिलेगी, लेकिन यह आपके द्वारा सभी दस्तावेज़ प्राप्त करने के लिए MongoDB सर्वर तक पहुँचने की संख्या में वृद्धि करेगा।
डिफ़ॉल्ट बैच आकार:
<ब्लॉकक्वॉट>अधिकांश प्रश्नों के लिए, पहला बैच 101 दस्तावेज़ या 1 मेगाबाइट से अधिक के लिए पर्याप्त दस्तावेज़ देता है। बैच का आकार अधिकतम बीएसओएन दस्तावेज़ आकार (16 एमबी) से अधिक नहीं होगा।
कोई सार्वभौमिक "दाएं" बैच आकार नहीं है। आपको विभिन्न मूल्यों के साथ परीक्षण करना चाहिए और देखना चाहिए कि आपके उपयोग के मामले के लिए उपयुक्त मूल्य क्या है यानी आप 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()