2016-02-08 7 views
7

नए एकत्रीकरण पाइपलाइन चरण $lookup के साथ हम अब 'बाएं बाहरी जुड़ने' करने में सक्षम हैं।

पहली नज़र में, मैं तुरंत के बारे में हमारी दो अलग-अलग संग्रह के साथ संग्रह denormalised एक की जगह और उन्हें क्वेरी करने पर शामिल होने के लिए $lookup उपयोग करना चाहते हैं। बड़ी संख्या में दस्तावेजों को अद्यतन करने के लिए, जब आवश्यक हो, यह होने की समस्या का समाधान होगा। अब हम सिर्फ एक दस्तावेज़ अपडेट कर सकते हैं।

लेकिन निश्चित रूप से यह सच होना बहुत अच्छा है? यह एक नोएसक्यूएल है, दस्तावेज़ डेटाबेस सभी के बाद!

MongoDB के भी highlights his concerns सीटीओ:

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

$lookup की सीमाएं क्या हैं? क्या मैं उन्हें वास्तविक समय, हमारे डेटा की परिचालन पूछताछ में उपयोग कर सकता हूं या उन्हें रिपोर्टिंग, ऑफलाइन स्थितियों के लिए छोड़ा जाना चाहिए?

उत्तर

4

मैं $lookup के लिए आपका उत्साह साझा करता हूं।

मुझे लगता है कि व्यापार-बंद हैं। एसक्यूएल डेटाबेस की प्रमुख चिंताओं में से एक (और जो नोएसक्यूएल की उत्पत्ति के कारणों में से एक है) यह है कि बड़े स्तर पर, जुड़ने में काफी समय लग सकता है (अच्छी तरह से, अपेक्षाकृत बोलना)।

यह निश्चित रूप से आपको अपने डेटा के लिए एक घोषणात्मक मॉडल देने में मदद करता है, लेकिन फिर यदि आप अपने पूरे नोएसक्यूएल डेटाबेस को मॉडल करना शुरू करते हैं, हालांकि यह पंक्तियों और तालिकाओं का डेटाबेस (उदाहरण के लिए ref एस का उपयोग कर रहा है), तो आप शुरू करते हैं इसे मॉडलिंग करना हालांकि यह केवल एक SQL डेटाबेस (डिग्री के लिए) है। यहां तक ​​कि MongoDB यह उल्लेख किया (जैसे आप अपने प्रश्न में डाल):

हम अभी भी चिंतित हैं कि $ देखने एक संबंधपरक डेटाबेस की तरह MongoDB के इलाज के लिए दुरुपयोग किया जा सकता हो।

आपने कहा:

यह हो रही है, जब आवश्यक दस्तावेजों की एक बड़ी संख्या को अद्यतन करने की समस्या का समाधान होगा। अब हम सिर्फ एक दस्तावेज़ अपडेट कर सकते हैं।

मुझे यकीन है कि क्या वास्तव में अपने संग्रह की तरह नहीं कर रहा हूँ, लेकिन यह $lookup के लिए एक अच्छा उपयोग हो सकता है जैसे कि निश्चित रूप से लग रहा है।

मैं उन्हें वास्तविक समय में उपयोग कर सकते हैं, परिचालन क्वेरी करने

मैं कहूंगा कि, फिर से, यह आपके यूज-केस पर निर्भर करता है।आप तुलना करना होगा: आपके प्रश्नों का

  • वांछित अर्थ विज्ञान (अनिवार्य बनाम कथात्मक)
  • अधिक रिलेशनल के रूप में अपने डेटा मॉडलिंग (और इस प्रकार $lookup का प्रयोग करके) कुछ निश्चित परिस्थितियों में चाहे संभावित व्यापार बंद में लायक है कम्प्यूटेशनल समय (यह मानते हुए कि कि संग्रह भर की क्वेरी भी, के बारे में चिंतित होना करने के लिए कुछ computationally बोल है)

आदि ...

मुझे यकीन है कि आने वाले महीनों में हम पर्फ़ ट देखेंगे हूँ "बाएं बाहरी जुड़ने" की टीएस और शायद मोंगोडीबी $lookup एक एंटीपाटरन के बारे में कुछ पोस्ट लिखना शुरू कर देगी।

आशा है कि यह उत्तर चर्चा में शामिल होने में मदद करेगा।

4

सबसे पहले मोंगोडीबी एक दस्तावेज़-आधारित डेटाबेस है और हमेशा होगा। तो $lookup एकत्रीकरण पाइपलाइन चरण संस्करण 3.2 की नई MongoDB के सीटीओ के रूप में संबंधपरक डेटाबेस (RDBMS) को MongoDB परिवर्तन नहीं किया उल्लेख किया:

हम अभी भी चिंतित हैं कि $ देखने एक संबंधपरक डेटाबेस की तरह MongoDB के इलाज के लिए दुरुपयोग किया जा सकता हैं ।

एक छोड़ दिया बाहरी एक ही डेटाबेस में एक unsharded संग्रह में शामिल होने से के लिए संग्रह "में शामिल हो गए" दस्तावेजों में फिल्टर करने के लिए बढ़िया प्रदर्शन:

दस्तावेज में उल्लेख किया $lookup के पहले सीमा यह है कि है प्रसंस्करण।

जिसका अर्थ है कि आप इसे एक शापित संग्रह के साथ उपयोग नहीं कर सकते हैं।

इसके अलावा $lookup ऑपरेटर के रूप में post में उल्लेख किया है इसलिए आप एक प्रारंभिक $unwind चरण localField denormalize अगर यह एक सरणी है की आवश्यकता होगी एक सरणी के साथ सीधे काम नहीं करता है।

अब आप ने कहा:

यह हो रही है, जब आवश्यक दस्तावेजों की एक बड़ी संख्या को अद्यतन करने की समस्या का समाधान होगा।

यह एक अच्छा विचार है कि आपके डेटा को पढ़ने के बजाए अक्सर अपडेट किया जाता है। जैसा कि 6 Rules of Thumb for MongoDB Schema Design: Part 3 में उल्लेख किया गया है, खासकर यदि आपके पास एक बड़ा पदानुक्रमित डेटा सेट है।

एक या अधिक फ़ील्ड को डीनार्मलाइज करना समझ में आता है अगर उन फ़ील्ड को अपडेट किए जाने से कहीं अधिक बार पढ़ा जाता है।

मुझे विश्वास है कि schema design सावधानी से आपको शायद $lookup ऑपरेटर की आवश्यकता नहीं होगी।

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