2013-02-08 9 views
11

मेरे पास मेरे रेल ऐप में एक मोंगो क्वेरी है जो समय समाप्त हो रही है क्योंकि संग्रह बहुत बड़ा है।रेल ऐप में मोंगोइड का उपयोग करके मोंगो क्वेरी कर्सर टाइमआउट त्रुटि

FbCheckin.where(ext_fb_place_id: self.ext_fb_place_id).all 

मैं प्रलेखन से पढ़ा है कि आप निम्न संदेश के साथ समय से कर्सर बाहर रोकने के लिए एक timeout विकल्प जोड़ सकते हैं:

Moped::Errors::CursorNotFound: The operation: "GET MORE" failed with error 

मैं कोशिश की है

FbCheckin.where(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all 
सहित कई तरीके

और

FbCheckin.find(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all 

लेकिन इनमें से कोई भी कर्सर को समय-समय पर रोक नहीं देता है।

क्या कोई जानता है कि मैं यह प्रश्न कैसे बना सकता हूं और कर्सर समय के बिना सभी FbCheckins एकत्र कर सकता हूं?

धन्यवाद

+1

यह [मोंगोइड मेलिंग सूची पर चर्चा] (https://groups.google.com/d/topic/mongoid/9QxJZg9sSZo/discussion) कुछ सहायक संकेत प्रदान कर सकता है। –

+0

@PrakashMurthy धन्यवाद, मैं इस पर एक नज़र डालेंगे – Huy

+0

क्या आपको कोई समाधान मिला? – cortex

उत्तर

-3

mongoid डिफ़ॉल्ट रूप से लंबे समय क्वेरी मार देंगे और उसके बाद इस त्रुटि को बढ़ाने

आप उदाहरण के लिए इस त्रुटि

से बचने के लिए mongoid.yml में raise_not_found_error विकल्प बदल सकते हैं:

production: 
    sessions: 
    default: 
    database: local 
    hosts: 
     - localhost:27017 
    options: 
     allow_dynamic_fields: true 
     raise_not_found_error: false 
+1

"raise_not_found_error (सत्य): एक आईडी द्वारा दस्तावेज़ खोजने का प्रयास करते समय एक Mongoid :: Errors :: DocumentNotFound बढ़ाएगा। जब गलत हो तो केवल उसी क्वेरी के लिए शून्य वापस आ जाएगा।" – cortex

26

जब आप mongodb से पूछताछ कर रहे हों तो कर्सर टाइमआउट को गलत पर सेट करना है।

यहाँ तुम क्या mongoid 3 के साथ कर सकते है:

FbCheckin.where(...).no_timeout.each do |fb_checkin| 
    "do something with fb_checkin" 
end 
+2

मुझे @Huy जैसी ही समस्या थी। एक पृष्ठभूमि कार्य में मैं डीबी अद्यतन करते समय Object.all पुनरावृत्त। अपडेट खनन वेब डेटा से आता है और इसलिए प्रत्येक लूप में बहुत अधिक रिमोट पेज फ़ेच से बचने के लिए इसमें एक विलंब विलंब होता है। इसने कर्सर को टाइमआउट करने का कारण बना दिया। @ क्वांटिन के समाधान ने समस्या हल की। मैंने अपना कोड '' 'Object.all.no_timeout.each do | object |' '' में बदल दिया और यह साथ में चल रहा है। – pferrel

2

उपयोग 'no_cursor_timeout' खोज क्वेरी के साथ विकल्प मोंगो रूबी ड्राइवर का उपयोग करते समय।

यह सभी कर्सर टाइमआउट अक्षम कर देगा। डिफ़ॉल्ट रूप से MongoDB उन सभी कर्सर को मारने का प्रयास करता है जो 10 मिनट से अधिक समय तक निष्क्रिय हैं।

अधिक जानकारी here मिल सकती है।

संबंधित मुद्दे