2012-09-20 13 views
21

मैं मोंगो ऐसी है कि मैं पहली बार क्षेत्र के लिए प्राथमिकता देना चाहते हैं और उसके बाद दूसरे क्षेत्र में एक प्रश्न है।एकाधिक क्षेत्रों के वर्गीकरण में मोंगो डीबी

मैं ऐसा है कि

db.col.find({category: A}).sort({updated: -1, rating: -1}).limit(10).explain() 

तो मैं निम्नलिखित सूचकांक

db.col.ensureIndex({category: 1, rating: -1, updated: -1}) 

यह कई वस्तुओं के रूप में सिर्फ जुर्माना स्कैनिंग काम के रूप में यानी 10

जरूरत बनाई क्वेरी करने के लिए है लेकिन अब कहते हैं कि मैं

db.col.find({category: { $ne: A}}).sort({updated: -1, rating: -1}).limit(10) 
क्वेरी करने की आवश्यकता है

तो मैं निम्नलिखित सूचकांक

db.col.ensureIndex({rating: -1, updated: -1}) 

बनाया है, लेकिन इस पूरे दस्तावेज़ की स्कैनिंग की ओर जाता है और जब मैं

db.col.ensureIndex({ updated: -1 ,rating: -1}) 

बनाने यह दस्तावेज़ की कम संख्या

मैं सिर्फ पूछना चाहता हूँ को स्कैन करता है कई क्षेत्रों में सॉर्ट करने के बारे में स्पष्ट होना और ऐसा करने पर संरक्षित करने का आदेश क्या है। मोंगो-डीबी दस्तावेजों को पढ़कर यह स्पष्ट हो जाता है कि जिस क्षेत्र पर हमें सॉर्टिंग करने की आवश्यकता है वह अंतिम क्षेत्र होना चाहिए। तो यह मामला है कि मैंने उपरोक्त मेरी $ ne क्वेरी में माना था। क्या मैं गलत हूं?

उत्तर

25

MongoDB निर्धारित करने के लिए जो दृष्टिकोण किसी क्वेरी के लिए सबसे अच्छा काम करता विभिन्न योजनाओं कोशिश कर रहा द्वारा query optimizer काम करता है। उस क्वेरी पैटर्न के लिए जीतने की योजना को अगले ~ 1,000 प्रश्नों के लिए कैश किया जाता है या जब तक आप explain() नहीं करते हैं।

जैसे समझने के लिए जो क्वेरी की योजना पर विचार किया गया है, तो आप explain(1) का उपयोग करना चाहिए,:

db.col.find({category:'A'}).sort({updated: -1}).explain(1) 

allPlans विस्तार सभी योजनाओं है कि तुलना में थे दिखाएगा।

आप किसी क्वेरी जो बहुत चयनात्मक नहीं है चलाते हैं (उदाहरण के लिए, अगर कई रिकॉर्ड {category: { $ne:'A'}} के अपने मानदंड से मेल खाते हैं), यह तेजी से MongoDB एक BasicCursor (तालिका स्कैन) का उपयोग कर परिणाम प्राप्त करने के लिए हो सकता है बल्कि एक सूचकांक के खिलाफ मिलान की तुलना में ।

क्वेरी में फ़ील्ड का क्रम आमतौर पर इंडेक्स चयन के लिए कोई फर्क नहीं पड़ता (रेंज क्वेरी के साथ कुछ अपवाद हैं)। सॉर्ट में फ़ील्ड का क्रम इंडेक्स चयन को प्रभावित करता है।यदि आपका sort() मानदंड इंडेक्स ऑर्डर से मेल नहीं खाता है, तो इंडेक्स का उपयोग होने के बाद परिणाम डेटा को फिर से क्रमबद्ध किया जाना चाहिए (यदि ऐसा होता है तो आपकोसमझाऊंगा आउटपुट में देखना चाहिए)।

यह भी ध्यान देने योग्य है कि मोंगोडीबी केवल one index per query ($or एस के अपवाद के साथ) का उपयोग करेगा।

तो तुम क्वेरी अनुकूलन करने के लिए कोशिश कर रहे हैं, तो:

db.col.find({category:'A'}).sort({updated: -1, rating: -1}) 

आप सूचकांक में सभी तीन क्षेत्रों को शामिल करना चाहते जाएगा: यदि आप किसी विशेष क्वेरी बाध्य करना चाहते हैं,

db.col.ensureIndex({category: 1, updated: -1, rating: -1}) 

FYI करें एक इंडेक्स (आमतौर पर आवश्यक या अनुशंसित नहीं) का उपयोग करने के लिए, hint() विकल्प है जिसे आप आजमा सकते हैं।

+0

कैसे इस सवाल का जवाब है सॉर्ट जाएगा में' नाम 'रखने की कोशिश? आप अभी भी यह सुनिश्चित नहीं कर सकते कि आपको "रेटिंग अवरोही, अद्यतन desc" क्रम में क्रमबद्ध किया गया है, "अपडेट किया गया desc, रेटिंग desc" – jobermark

+0

@jobermark मूल प्रश्न में क्वेरी मानदंड 'श्रेणी' है जो कि यौगिक सॉर्ट ऑर्डर ' {अद्यतन: -1, रेटिंग: -1} '। सूचकांक में चाबियों का क्रम (और दिशा) महत्वपूर्ण है; सुझाया गया सूचकांक '{रेटिंग: -1, अपडेटेड -1 -1}' द्वारा क्रमबद्ध 'सामग्री' पर एक खोज का कुशलतापूर्वक समर्थन नहीं करेगा। यदि आप चालक में कंपाउंड सॉर्ट मानों में हेरफेर कर रहे हैं तो ऑर्डरिंग सुनिश्चित करने के लिए ऑर्डर किए गए हैश/डिक्शनरी का उपयोग करें। अधिक जानकारी के लिए [मल्टीओडीबी दस्तावेज में [एकाधिक फ़ील्ड पर सॉर्ट करें] देखें (https://docs.mongodb.org/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields)। – Stennie

1

यही सच है लेकिन वहाँ आप आदेश देने की दो परतों हैं यहाँ जब से तुम एक यौगिक सूचकांक पर छँटाई कर रहे हैं।

आपने देखा के रूप में जब सूचकांक के पहले क्षेत्र तरह यह काम के पहले क्षेत्र से मेल खाता है और सूचकांक में देखा गया था। हालांकि जब इसके आसपास के दूसरे तरीके से काम नहीं करता है।

जैसे अपने खुद के obersvations क्रम संरक्षित करने की जरूरत से पहले से खेतों पिछले की क्वेरी आदेश है। मोंगो विश्लेषक कभी-कभी किसी इंडेक्स से मेल खाने के लिए फ़ील्ड के चारों ओर स्थानांतरित कर सकता है लेकिन आम तौर पर यह पहले फ़ील्ड को आजमाएगा और मैच करेगा, अगर यह इसे छोड़ नहीं सकता है।

0

इस कोड को यह डेटा पहले नाम के आधार पर सॉर्ट होगा तो कुंजी धारक यह फिल्टर '

var cursor = db.collection('vc').find({ "name" : { $in: [ /cpu/, /memo/ ] }  }, { _id: 0, }).sort({ "name":1 , "filter": 1 }); 
संबंधित मुद्दे