इंडेक्स का अधिकतम लाभ उठाने के लिए आपको पाइपलाइन में पर्याप्त रूप से $match की आवश्यकता होती है जो इंडेक्स के सभी क्षेत्रों का उपयोग करता है। और $and
. का उपयोग करने से बचें ऑपरेटर क्योंकि यह अनावश्यक है और वर्तमान (2.4) संस्करण में एक इंडेक्स का पूरी तरह से उपयोग नहीं किया जा सकता है (सौभाग्य से आगामी 2.6 के लिए तय किया गया है)।
हालाँकि, क्वेरी बिल्कुल सही नहीं है क्योंकि आपको $elemMatch
. का उपयोग करने की आवश्यकता है यह सुनिश्चित करने के लिए कि नाम और मान फ़ील्ड को संतुष्ट करने के लिए एक ही तत्व का उपयोग किया जाता है।
आपकी क्वेरी होनी चाहिए:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
अब, यह नहीं है एक कवर की गई क्वेरी होने जा रही है, क्योंकि विशेषताएँ। मान और नाम एम्बेड किए गए हैं, इस तथ्य का उल्लेख नहीं करने के लिए कि नाम अनुक्रमणिका में नहीं है।
आपको इंडेक्स {"type":1, "attributes.value":1, "attributes.name":1}
होना चाहिए सर्वश्रेष्ठ प्रदर्शन के लिए, हालांकि इसे अभी भी कवर नहीं किया जाएगा, यह अब की तुलना में बहुत अधिक चयनात्मक होगा।