मोंगोडब एग्रीगेशन फ्रेमवर्क के बारे में बताएं


118

क्या MongoDB में एकत्रीकरण ढांचे के लिए एक व्याख्या कार्य है? मैं इसे प्रलेखन में नहीं देख सकता।

यदि जाँचने का कोई और तरीका नहीं है, तो एकत्रीकरण ढांचे के भीतर एक क्वेरी कैसे करता है?

मुझे पता है कि तुम बस करो

db.collection.find().explain()

लेकिन एकत्रीकरण ढांचे के साथ मुझे एक त्रुटि मिलती है

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()

जवाबों:


172

MongoDB संस्करण 3.0 के साथ शुरू, बस से क्रम बदल रहा है

collection.aggregate(...).explain()

सेवा

collection.explain().aggregate(...)

आपको वांछित परिणाम ( यहाँ प्रलेखन ) देगा।

पुराने संस्करणों> = 2.6 के लिए, आपको एकत्रीकरण पाइपलाइन संचालन के लिए विकल्प का उपयोग करना होगाexplain

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

एकत्रीकरण फ्रेमवर्क के साथ एक महत्वपूर्ण विचार है कि एक सूचकांक केवल एक पाइप लाइन के लिए प्रारंभिक डेटा प्राप्त करने का इस्तेमाल किया जा सकता है (उदाहरण के लिए के उपयोग $match, $sort, $geonearएक पाइप लाइन की शुरुआत में) और साथ ही बाद में $lookupऔर $graphLookupचरणों। एक बार डेटा के प्रसंस्करण के लिए एकत्रीकरण पाइपलाइन में प्राप्त किए गए किया गया है (उदाहरण के लिए की तरह चरणों के माध्यम से गुजर $project, $unwindऔर $group) आगे हेरफेर में स्मृति (संभवतः अस्थायी फ़ाइलों का उपयोग कर यदि हो जाएगा allowDiskUseविकल्प सेट है)।

पाइपलाइनों का अनुकूलन

सामान्य तौर पर, आप एकत्रीकरण पाइपलाइनों को इसके द्वारा अनुकूलित कर सकते हैं:

  • $matchप्रासंगिक दस्तावेजों पर प्रसंस्करण को प्रतिबंधित करने के लिए एक मंच के साथ एक पाइपलाइन शुरू करना ।
  • प्रारंभिक $match/ $sortचरणों को सुनिश्चित करना एक कुशल सूचकांक द्वारा समर्थित है ।
  • डेटा को फ़िल्टर करके जल्दी का उपयोग कर $match, $limitऔर $skip
  • अनावश्यक चरणों और दस्तावेज़ हेरफेर को कम करना (शायद जटिल एकत्रीकरण जिम्नास्टिक की आवश्यकता होने पर अपने स्कीमा पर पुनर्विचार करना)।
  • यदि आपने अपने MongoDB सर्वर को अपग्रेड किया है तो नए एकत्रीकरण ऑपरेटरों का लाभ उठाएं। उदाहरण के लिए, MongoDB 3.4 ने एरेज़, स्ट्रिंग्स और पहलुओं के साथ काम करने के लिए समर्थन सहित कई नए एकत्रीकरण चरणों और अभिव्यक्तियों को जोड़ा ।

ऐसे कई एग्रीगेशन पाइप लाइन ऑप्टिमाइज़ेशन हैं जो स्वचालित रूप से आपके MongoDB सर्वर संस्करण पर निर्भर करते हैं। उदाहरण के लिए, आउटपुट परिणामों को प्रभावित किए बिना निष्पादन में सुधार करने के लिए आसन्न चरणों को समतल और / या फिर से व्यवस्थित किया जा सकता है।

सीमाएं

MongoDB 3.4 के अनुसार, एग्रीगेशन फ्रेमवर्क explainविकल्प इस बात की जानकारी प्रदान करता है कि पाइपलाइन कैसे संसाधित होती है, लेकिन क्वेरी के executionStatsलिए मोड के समान स्तर का समर्थन नहीं करता है find()। आप प्रारंभिक क्वेरी निष्पादन के अनुकूलन पर ध्यान केंद्रित कर रहे हैं आप की संभावना यह फायदेमंद बराबर की समीक्षा करने के मिलेगा find().explain()साथ क्वेरी executionStatsया allPlansExecutionशब्दाडंबर

MongoDB समस्या ट्रैकर को देखने / बढ़ाने के लिए कुछ प्रासंगिक फ़ीचर अनुरोध हैं, जो कि अधिक विस्तृत निष्पादन आँकड़े के बारे में / प्रोफ़ाइल एकत्रीकरण पाइपलाइनों को अनुकूलित करने में मदद करने के बारे में हैं:


जानकारी के लिए धन्यवाद देखूंगा कि क्या मैं कोई बदलाव कर सकता हूं।
एससीबी

क्या $sortवस्तु पाइपलाइन की सरणी के अंदर नहीं होनी चाहिए ?
जॉनीएचके

@ जॉनीएचके: हाँ। कुछ प्रकार के लोग गलत तरीके से उत्तर को "सही" कर रहे हैं :)।
स्टेनी

लेकिन यह "निष्पादन" नहीं दे रहा है
कानागवेलु सुगम कुमार

1
@KanagaveluSugumar मैंने एग्रीगेशन फ्रेमवर्क explainसीमाओं पर स्पष्टीकरण के साथ-साथ अतिरिक्त निष्पादन आंकड़ों के लिए प्रासंगिक सुविधा अनुरोधों के साथ उत्तर अपडेट किया है ।
स्टेनी

29

संस्करण 2.6.x के साथ शुरू mongodb उपयोगकर्ताओं को एकत्रीकरण ढांचे के साथ समझाने की अनुमति देता है ।

आपको बस इतना करना है कि व्याख्या को जोड़ना है: सच

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

राफा के लिए धन्यवाद, मुझे पता है कि यह 2.4 में भी करना संभव था, लेकिन केवल इसके माध्यम से runCommand()। लेकिन अब आप कुल मिलाकर भी उपयोग कर सकते हैं।


5
वास्तव में, आप db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})MongoDB 2.2 के बाद से समुच्चय की व्याख्या कर सकते हैं ।
रफा

1
आप सही हैं, 2.2 और 2.4 में आप केवल रनकोम के माध्यम से समुच्चय की व्याख्या कर सकते हैं। Upvote के लिए धन्यवाद।
राफा

3
जबकि विकल्प तकनीकी रूप से 2.6 से पहले रनकमांड के माध्यम से मौजूद है, यह सही परिणाम देने की गारंटी नहीं है और इसकी वकालत नहीं की जानी चाहिए। आपको वास्तव में केवल 2.5.3 या नए में इसका उपयोग करना चाहिए (और उम्मीद है कि 2.6 उत्पादन रिलीज से पहले कुछ कीड़े अभी भी हो सकते हैं)।
स्टेनी डे

20

एकत्रीकरण की रूपरेखा

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

एकत्रीकरण ढांचा चरण

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

एक ही पाइपलाइन के भीतर कई बार एक ही प्रकार का मंच

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


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