जब कोई क्रम क्रम निर्दिष्ट नहीं होता है, तो MongoDB कैसे रिकॉर्ड करता है?


103

जब हम बिना किसी प्रकार के आदेश के एक मानगो खोज () क्वेरी चलाते हैं, तो डेटाबेस परिणामों को क्रमबद्ध करने के लिए आंतरिक रूप से क्या उपयोग करता है?

मानगो वेबसाइट पर प्रलेखन के अनुसार :

जब कोई पैरामीटर के साथ एक खोज () निष्पादित करते हैं, तो डेटाबेस वस्तुओं को आगे के प्राकृतिक क्रम में वापस कर देता है।

मानक तालिकाओं के लिए, प्राकृतिक आदेश विशेष रूप से उपयोगी नहीं है, क्योंकि आदेश अक्सर प्रविष्टि क्रम के करीब है, यह होने की गारंटी नहीं है। हालांकि, कैप्ड कलेक्शंस के लिए, प्राकृतिक ऑर्डर को इंसर्शन ऑर्डर होने की गारंटी है। यह बहुत उपयोगी हो सकता है।

हालांकि मानक संग्रह (गैर कैप्ड संग्रह) के लिए, परिणाम को सॉर्ट करने के लिए किस फ़ील्ड का उपयोग किया जाता है? यह _id क्षेत्र या कुछ और है?

संपादित करें:

मूल रूप से, मुझे लगता है कि मैं जो पाने की कोशिश कर रहा हूं वह यह है कि अगर मैं निम्नलिखित खोज क्वेरी को निष्पादित करता हूं:

db.collection.find({"x":y}).skip(10000).limit(1000);

समय में दो अलग-अलग बिंदुओं पर: t1 और t2 , क्या मुझे अलग परिणाम सेट मिलेंगे:

  1. जब t1 और t2 के बीच कोई अतिरिक्त लेखन नहीं हुआ है?
  2. जब t1 और t2 के बीच नए लेखन हुए हैं?
  3. नए सूचकांक हैं जिन्हें t1 और t2 के बीच जोड़ा गया है?

मैंने एक अस्थायी डेटाबेस पर कुछ परीक्षण चलाए हैं और मैंने जो परिणाम प्राप्त किए हैं, वे सभी 3 मामलों के लिए समान ( हां ) हैं - लेकिन मैं यह सुनिश्चित करना चाहता था और मैं निश्चित हूं कि मेरे परीक्षण के मामले पूरी तरह से नहीं थे।

जवाबों:


121

जब कोई भी निर्दिष्ट नहीं है तो डिफ़ॉल्ट सॉर्ट क्रम क्या है?

डिफ़ॉल्ट आंतरिक सॉर्ट क्रम (या प्राकृतिक आदेश ) एक अपरिभाषित कार्यान्वयन विवरण है। भंडारण इंजन के लिए ऑर्डर को बनाए रखना अतिरिक्त ओवरहेड है और MongoDB का API स्पष्ट sort()या विशिष्ट आकार के कैप संग्रह के विशेष मामले के बाहर की भविष्यवाणी को अनिवार्य नहीं करता है, जिसमें उपयोग प्रतिबंध जुड़े हुए हैं । विशिष्ट वर्कलोड के लिए यह स्टोरेज इंजन के लिए उपलब्ध प्रचारित स्थान का पुन: उपयोग करने और डिस्क पर और मेमोरी में सबसे कुशलता से डेटा को कैसे स्टोर करना है, इसके बारे में निर्णय लेने के लिए वांछनीय है।

किसी भी क्वेरी मापदंड के बिना, परिणाम प्राकृतिक क्रम में भंडारण इंजन द्वारा वापस आ जाएंगे ( क्रम में उर्फ वे पाए जाते हैं )। परिणाम आदेश सम्मिलन आदेश के साथ मेल खाता है, लेकिन यह व्यवहार की गारंटी नहीं है और इसे (छायांकित संग्रह से अलग) पर निर्भर नहीं किया जा सकता है।

कुछ उदाहरण जो भंडारण (प्राकृतिक) क्रम को प्रभावित कर सकते हैं:

  • वायर्डटेगर डिस्क बनाम इन-मेमोरी कैश पर दस्तावेजों के एक अलग प्रतिनिधित्व का उपयोग करता है, इसलिए आंतरिक डेटा संरचनाओं के आधार पर प्राकृतिक आदेश बदल सकते हैं।
  • मूल MMAPv1 संग्रहण इंजन (MongoDB 4.2 में हटा दिया गया) पेडिंग नियमों के आधार पर दस्तावेजों के लिए रिकॉर्ड स्थान आवंटित करता है। यदि कोई दस्तावेज़ वर्तमान में आवंटित रिकॉर्ड स्थान से आगे निकल जाता है, तो दस्तावेज़ स्थान (और प्राकृतिक आदेश) प्रभावित होगा। हटाए गए या स्थानांतरित किए गए दस्तावेज़ों के कारण पुन: उपयोग के लिए उपलब्ध संग्रहण में नए दस्तावेज़ भी डाले जा सकते हैं।
  • प्रतिकृति प्रतिकृति सेट सदस्यों में लगातार लिखने के कार्यों को लागू करने के लिए एक आदर्श oplogotent प्रारूप का उपयोग करता है । प्रत्येक प्रतिकृति सेट सदस्य स्थानीय डेटा फ़ाइलों को बनाए रखता है जो प्राकृतिक क्रम में भिन्न हो सकते हैं, लेकिन जब ओप्लोग अपडेट लागू होते हैं तो समान डेटा परिणाम होंगे।

यदि सूचकांक का उपयोग किया जाता है तो क्या होगा?

यदि एक सूचकांक का उपयोग किया जाता है, तो दस्तावेजों को उनके द्वारा पाए जाने वाले क्रम में लौटा दिया जाएगा (जो आवश्यक रूप से सम्मिलन आदेश या I / O आदेश से मेल खाता है)। यदि एक से अधिक सूचकांक का उपयोग किया जाता है, तो आदेश आंतरिक रूप से इस बात पर निर्भर करता है कि किस सूचकांक ने पहली बार डी-डुप्लीकेशन प्रक्रिया के दौरान दस्तावेज़ की पहचान की।

आप एक उम्मीद के मुताबिक सॉर्ट क्रम चाहते हैं तो आप चाहिए एक स्पष्ट शामिल sort()आपकी क्वेरी के साथ और अपने तरह कुंजी के लिए अद्वितीय मान हैं।

कैप किए गए संग्रह प्रविष्टि क्रम को कैसे बनाए रखते हैं?

कैप्ड संग्रह में प्राकृतिक क्रम के लिए उल्लिखित कार्यान्वयन अपवाद उनके विशेष उपयोग प्रतिबंधों द्वारा लागू किया जाता है: दस्तावेज़ प्रविष्टि क्रम में संग्रहीत किए जाते हैं, लेकिन मौजूदा दस्तावेज़ आकार में वृद्धि नहीं की जा सकती है और दस्तावेजों को स्पष्ट रूप से हटाया नहीं जा सकता है। ऑर्डरिंग कैप्ड कलेक्शन डिज़ाइन का एक हिस्सा है जो पहले सबसे पुराने दस्तावेज़ "आयु आउट" सुनिश्चित करता है।


4
तो इसका मतलब यह है कि अगर मैं समान खोज कमांड चलाता हूं: db.collection.find ({"x": y})। स्किप (20000) .limit (1000) दो अलग-अलग बिंदुओं पर समय में, मैं अलग परिणाम प्राप्त करूंगा। सेट? यदि दोनों आज्ञाओं के बीच में कोई लेखन नहीं हुआ है तो क्या होगा?
saurabhj

6
@ सौरभ: कुछ उदाहरण जोड़े गए जो प्राकृतिक व्यवस्था को प्रभावित करेंगे। यदि दस्तावेज़ों को स्थानांतरित / हटा दिया गया है तो आपको अलग-अलग परिणाम सेट मिल सकते हैं। यदि कोई दस्तावेज़ आवेषण / अद्यतन / हटाए नहीं गए हैं तो आपको वही परिणाम प्राप्त करना चाहिए। अनुक्रमणिका जोड़ने से डिस्क पर दस्तावेज़ों का स्थान प्रभावित नहीं होता है।
स्टेनी जू

7
कैविट को भी जोड़ना चाहिए कि यदि आप प्रतिकृति का उपयोग कर रहे हैं तो प्राकृतिक क्रम प्रतिकृति सेट सदस्यों के बीच भिन्न हो सकता है।
स्टेनी जूल

क्या किसी को पता है कि यहाँ टिप्पणी की गई 2 बिंदुओं में से किसी को कैसे मजबूर किया जाए? हमने दस्तावेजों को संशोधित करने की कोशिश की, लेकिन वे अभी भी अपने सम्मिलन क्रम में वापस आ गए हैं ... मैं इस बारे में उत्सुक हूं कि क्या प्राकृतिक आदेश सम्मिलन क्रम से अलग हो सकता है।
फेरन मायलिनच

एक डिफॉल्ट ऑर्डर (उदाहरण के लिए {createdAt: -1}) को लागू करने के लिए ऑप्टिमिस्टिक यूआई पैटर्न (क्रिएट में डेटा की अपडेट सूचियों को बनाने / अपडेट / डिलीट करने के बाद बिना किसी प्रतिक्रिया के इंतजार किए बिना) को लागू करना आवश्यक है। अन्यथा आप क्लाइंट-साइड आशावादी क्रम और सर्वर प्रतिक्रिया क्रम से मेल नहीं खा सकते हैं।
एरिक बूरे

8

इसे संग्रहीत क्रम (फ़ाइल में आदेश) में लौटाया जाता है, लेकिन यह सुनिश्चित करने की गारंटी नहीं है कि वे सम्मिलित क्रम में हैं। वे _id फ़ील्ड द्वारा सॉर्ट नहीं किए जाते हैं। कभी-कभी यह देखा जा सकता है कि यह सम्मिलन आदेश द्वारा सॉर्ट किया गया है लेकिन यह दूसरे अनुरोध में बदल सकता है। यह विश्वसनीय नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.