2013-05-27 12 views
32

में सबडॉक्यूमेंट इंडेक्स क्या होता है जब मैं ensureIndex(data) पर कॉल करता हूं तो सामान्य डेटा data:{name: "A",age:"B", job : "C"} जैसा दिखता है? क्या यह इन तीन क्षेत्रों में एक कंपाउंड इंडेक्स बनाएगा या क्या यह केवल एक इंडेक्स लागू करेगा जब डेटा से अनुरोध किया जाता है या कुछ अलग है?मोंगो

+1

यह जांच करने के लिए आसान है। बस एक परीक्षण संग्रह बनाएं और '.explain() 'के साथ कुछ प्रश्नों को आग लगाएं। मैं यही करूंगा। मुझे यकीन नहीं है कि मोंगो क्या करेगा। –

उत्तर

41

आप क्या कर सकते हैं या तो:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1}) 
> db.collection.ensureIndex({"data": 1}) 

यह indexes-on-embedded-fields के तहत दस्तावेज में चर्चा की है और indexes on sub documents

उप दस्तावेज़ खंड के महत्वपूर्ण खंड 'प्रदर्शन समानता सहायक दस्तावेज़ों पर मेल खाता है, क्षेत्र आदेश है मामलों और उप-दस्तावेजों को बिल्कुल मेल खाना चाहिए। '

इसका मतलब है कि 2 इंडेक्स सरल प्रश्नों के लिए समान हैं।

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

यह वास्तव में आपके उपयोग के मामले पर निर्भर करता है।

वैसे भी, एक बार आप सूचकांक आप जाँच कर सकते हैं क्या बनाया है के साथ बनाया गया है: आप उत्पादन यह data.name_1_data.age_1_data.job_1 नामक एक नया कुंजी बनाई से देख सकते हैं

> db.collection.getIndexes() 
[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "test.collection", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "data.name" : 1, 
     "data.age" : 1, 
     "data.job" : 1 
    }, 
    "ns" : "test.collection", 
    "name" : "data.name_1_data.age_1_data.job_1" 
} 

]

(_id_ सूचकांक है हमेशा बनाया)।

आप फिर अपने नए सूचकांक परीक्षण करना चाहते हैं आप कर सकते हैं:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}}) 
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}}) 
> db.collection.find({"data.name" : "A"}).explain() 
{ 
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1", 
    .... more stuff 

मुख्य बात आप देख सकते हैं कि है कि आपका नया सूचकांक इस्तेमाल किया गया था (BtreeCursor data.name_1_data.age_1_data.job_1 में है कर्सर फ़ील्ड यह इंगित करता है कि यह मामला है)। यदि आप "cursor" : "BasicCursor" देखते हैं, तो आपकी अनुक्रमणिका का उपयोग नहीं किया गया था।

अधिक विस्तृत जानकारी के लिए here देखें।

-1

आप इस कोशिश कर सकते हैं:

db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1}) 
+3

यह सवाल का जवाब नहीं देता है, अर्थात् ऐसा करने का नतीजा क्या है। – Christophe