कुछ चीज़ें जो आप यहाँ कर सकते हैं:
सबसे पहले, $या के बजाय $in का उपयोग करें।
दूसरे, MongoDB केवल . कर सकता है अपने पहले मैच के लिए एक इंडेक्स का उपयोग करें, इसलिए आपको तय करना होगा (इसे आज़माकर) दोनों में से कौन सा मैच बेहतर है। लक्ष्य यह है कि एक क्वेरी जितनी तेज़ हो, और उतनी ही कम दस्तावेज़ आपकी पाइपलाइन से गुज़र रहे हों। उसके लिए आप निम्न चीज़ें करें:
सबसे पहले, तीन इंडेक्स बनाएं:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
फिर निम्नलिखित तीन प्रश्नों को चलाएँ और "कर्सर", "n", "nScanned" और "ms" फ़ील्ड पर ध्यान दें:
branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();
आखिरी क्वेरी के लिए, आप देखेंगे कि "कर्सर" "बेसिक कर्सर" है, क्योंकि $ne क्वेरी इंडेक्स का उपयोग नहीं कर सकती है।
अन्य दो आपको "ms", "n" और "nScanned" के लिए विभिन्न मान दिखाएंगे। "ms" क्वेरी को चलाने में लगने वाला समय है। यदि यह लगभग समान है, तो "n" और "nScanned" मानों के बीच अंतर देखें। मैं उम्मीद और अनुमान लगाने जा रहा हूं कि "संस्करण। शाखा" क्वेरी के लिए अंतर 0 है। "सिद्धांत" क्वेरी के लिए यह अलग हो सकता है। यदि "एमएस" लगभग समान नहीं है तो $ मैच डालें जो सबसे तेज़ था पहले आपकी एग्रीगेशन पाइपलाइन में $match क्लॉज के रूप में।
यदि गति ("ms") दोनों समान हैं, तो "n" मानों की जाँच करें। यदि "उपसर्ग" क्वेरी के लिए "n" "5" है और "संस्करण.शाखा" क्वेरी के लिए "n" "500" है, तो इसका मतलब है कि "उपसर्ग" क्वेरी का परिणाम बेहतर है, जितना कम दस्तावेज वापस कर दिए जाते हैं। उस स्थिति में, इसे अपने पहले $match क्लॉज के रूप में कुल मिलाकर रखें। अगर "versions.branch" बहुत कम है, तो उस एक को पहले $match क्लॉज के रूप में उपयोग करें।