2011-05-05 16 views
5

जब मोंगोडब के लिए प्रश्न पूछे जाते हैं, तो स्मृति में परिणाम सेट के साथ कर्सर कैसे निपटता है? क्या कर्सर सभी दस्तावेजों को पुनर्प्राप्त करता है जो क्वेरी से मेल खाते हैं, एक बार में? या यह एक समय में 1 दस्तावेज़ पुनर्प्राप्त करता है? या वे buffered हैं? या क्या कोई अलग समाधान है जिसके बारे में मुझे नहीं पता?PHP MongoDB ड्राइवर का कर्सर परिणाम सेट कैसे बफर करता है?

यदि यह एक buffered समाधान है, तो वे सर्वर/क्लाइंट पर कैसे संग्रहीत किए जाते हैं? क्लाइंट स्थानीय रूप से कितना डेटा रखता है?

+0

मेमोरी - कौन सी मेमोरी, सर्वर या क्लाइंट? एक कर्सर दस्तावेज़ों को कभी भी पुनर्प्राप्त नहीं करता है, यह एक कर्सर है। Buffered - फिर कहाँ? ग्राहक या सर्वर पर? या आप केवल ग्राहक के लिए PHP के रूप में रुचि रखते हैं? – hakre

+0

दोनों, वास्तव में। मुझे कल्पना है कि सर्वर को कहीं भी परिणाम स्टोर करना होगा। और, शायद मैं कर्सर के काम के रूप में उलझन में हूं - लेकिन कर्सर डेटा के लिए मेरे "प्रवेश द्वार" के रूप में कार्य करता है, इसलिए इसे इसे कहीं से प्राप्त करना होगा, और कहीं इसे स्टोर करना होगा। मैं सिर्फ यह जानने/समझने की कोशिश कर रहा हूं कि डेटा कहां संग्रहीत किया जा रहा है और PHP क्लाइंट द्वारा इसे कैसे एक्सेस/buffered किया जाता है। –

+0

एक कर्सर क्लाइंट को सर्वर पर उपलब्ध परिणामसेट के माध्यम से नेविगेट करने की अनुमति देता है। तो आप 500 दस्तावेजों से पूछताछ करते हैं, सर्वर को केवल कर्सर की आवश्यकता होती है। ग्राहक धन्यवाद देता है और उसके बाद उस सेट के भीतर कहीं भी नेविगेट करने के लिए कर्सर का उपयोग करता है। फिर ग्राहक कहता है: कर्सर को इंगित करने पर मुझे दस्तावेज़ दें। सर्वर कहता है: ठीक है मैं कर्सर को जानता हूं, इसलिए मैं आपको दस्तावेज़ दे सकता हूं। कम से कम मैं कर्सर को समझता हूं। कर्सर स्वयं कभी नहीं लाता है लेकिन क्लाइंट और सर्वर के बीच संचार में उपयोग किया जाता है। – hakre

उत्तर

5

MongoDB wire protocol में क्वेरी जारी करते समय बैच आकार के लिए विनिर्देश हैं।

मूल आधार है कि ग्राहक चालक numberToReturn ध्वज के साथ कोई क्वेरी भेजता है। यदि क्वेरी numberToReturn से मेल खाती है, तो केवल उस नंबर को क्लाइंट को वापस कर दिया जाता है।

तो सर्वर प्रभावी रूप से क्लाइंट को "बैच" भेजता है। यदि पूरे बैच के माध्यम से ग्राहक चक्र, ग्राहक getmore अनुरोध जारी करता है और अगले बैच प्राप्त करता है। इस बीच, सर्वर को सभी परिणामों को स्मृति में लोड करने की आवश्यकता नहीं है, केवल ग्राहक के अनुरोध को पूरा करने के लिए पर्याप्त है।

PHP ड्राइवर इस जटिलता को दूर करता है। ड्राइवर के साथ आप जो भी करते हैं, वह अगले आइटम का अनुरोध करता है और ड्राइवर उपयुक्त होने पर getmore को संभालेगा।

आकार के संदर्भ में, आप अधिकतम BSON आकार या numberToReturn के छोटे मिल जाएगा। इसलिए यदि दस्तावेज़ बहुत बड़े हैं, तो आप एक बार में बहुत अधिक डेटा भेजने से रोकने के लिए अधिकतम बीएसओएन आकार को दबा सकते हैं।

किसी भी अधिक जानकारी प्राप्त करने के लिए सबसे अच्छा स्थान the actual code है।