MongoDB
इंडेक्स
खोज…
वाक्य - विन्यास
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
टिप्पणियों
प्रदर्शन प्रभाव : ध्यान दें कि इंडेक्स पठन प्रदर्शन को बेहतर बनाते हैं, लेकिन लेखन प्रदर्शन पर बुरा प्रभाव डाल सकते हैं, क्योंकि किसी दस्तावेज़ को सम्मिलित करने के लिए सभी इंडेक्स को अपडेट करने की आवश्यकता होती है।
एकल मैदान
db.people.createIndex({name: 1})
यह फ़ील्ड नाम पर आरोही एकल फ़ील्ड इंडेक्स बनाता है।
इस प्रकार के अनुक्रमित में सॉर्ट क्रम अप्रासंगिक है, क्योंकि मोंगो दोनों दिशाओं में सूचकांक को पीछे कर सकता है।
यौगिक
db.people.createIndex({name: 1, age: -1})
यह name
और age
क्षेत्रों पर इस मामले में, कई क्षेत्रों पर एक सूचकांक बनाता है। यह name
में आरोही और age
में नीचे उतरना होगा।
इस प्रकार के सूचकांक में, सॉर्ट क्रम प्रासंगिक है, क्योंकि यह निर्धारित करेगा कि इंडेक्स एक प्रकार के संचालन का समर्थन कर सकता है या नहीं। कंपाउंड इंडेक्स के किसी भी उपसर्ग पर रिवर्स सॉर्टिंग का समर्थन किया जाता है, जब तक कि सॉर्ट सॉर्ट कुंजी के सभी के लिए रिवर्स सॉर्ट दिशा में होता है। अन्यथा, यौगिक अनुक्रमितों के लिए छँटाई को सूचकांक के क्रम से मेल खाना चाहिए।
फ़ील्ड क्रम भी महत्वपूर्ण है, इस मामले में सूचकांक को पहले name
क्रमबद्ध किया जाएगा, और प्रत्येक नाम मान के भीतर, age
क्षेत्र के मूल्यों के अनुसार क्रमबद्ध किया जाएगा। यह सूचकांक को name
फ़ील्ड पर या name
और age
पर प्रश्नों द्वारा उपयोग करने की अनुमति देता है, लेकिन अकेले age
पर नहीं।
हटाएं
एक इंडेक्स को छोड़ने के लिए आप इंडेक्स नाम का उपयोग कर सकते हैं
db.people.dropIndex("nameIndex")
या सूचकांक विनिर्देश दस्तावेज
db.people.dropIndex({name: 1})
सूची
db.people.getIndexes()
यह लोगों के संग्रह पर एक सूचकांक का वर्णन करने वाले प्रत्येक दस्तावेज़ की एक सरणी लौटाएगा
सूचकांक निर्माण मूल बातें
नीचे देखें लेन-देन संग्रह
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
फ़ंक्शन संग्रह के लिए उपलब्ध सभी सूचकांकों को दिखाएगा।
db.transactions.getIndexes();
उपरोक्त कथन का आउटपुट देखते हैं।
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
लेनदेन संग्रह के लिए पहले से ही एक सूचकांक है। ऐसा इसलिए है क्योंकि MongoDB संग्रह के निर्माण के दौरान _id
फ़ील्ड पर एक अद्वितीय सूचकांक बनाता है। _id
सूचकांक ग्राहकों को _id
फ़ील्ड के लिए समान मूल्य वाले दो दस्तावेज़ सम्मिलित करने से रोकता है। आप इस सूचकांक को _id
फ़ील्ड पर नहीं छोड़ सकते।
अब cr_dr फ़ील्ड के लिए एक इंडेक्स जोड़ते हैं;
db.transactions.createIndex({ cr_dr : 1 });
सूचकांक निष्पादन का परिणाम निम्नानुसार है।
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
बनाया गयाCollectionAutomatically इंगित करता है कि ऑपरेशन ने एक संग्रह बनाया। यदि कोई संग्रह मौजूद नहीं है, तो MongoDB इंडेक्सिंग ऑपरेशन के हिस्से के रूप में संग्रह बनाता है।
db.transactions.getIndexes();
फिर।
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
अब आप देखें कि लेनदेन संग्रह में दो सूचकांक हैं। Default _id
सूचकांक और cr_dr_1
जो हम बनाया। नाम MongoDB द्वारा सौंपा गया है। आप नीचे अपना नाम सेट कर सकते हैं।
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
अब db.transactions.getIndexes();
आपको तीन संकेत देगा।
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
इंडेक्स बनाते समय { cr_dr : -1 }
1 का मतलब इंडेक्स ascending
क्रम में और -1 descending
क्रम के लिए होगा।
हश्र सूचकांक
अनुक्रमित को हैशेड के रूप में भी परिभाषित किया जा सकता है। यह समानता प्रश्नों पर अधिक प्रदर्शन करने वाला है , लेकिन श्रेणी के प्रश्नों के लिए कुशल नहीं है; हालाँकि आप एक ही क्षेत्र पर दोनों हैशेड और आरोही / अवरोही अनुक्रमित को परिभाषित कर सकते हैं।
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
एक सूचकांक को छोड़ना / हटाना
यदि सूचकांक नाम ज्ञात है,
db.collection.dropIndex('name_of_index');
यदि इंडेक्स नाम ज्ञात नहीं है,
db.collection.dropIndex( { 'name_of_field' : -1 } );
एक संग्रह के संकेत प्राप्त करें
db.collection.getIndexes();
उत्पादन
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
अनोखा सूचकांक
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
परिभाषित सूचकांक (या तो एकल या यौगिक) पर अद्वितीयता लागू करें। यदि सूचकांक में पहले से ही डुप्लिकेट मान हैं, तो अनुक्रमणिका बनाना विफल हो जाएगा; अनुक्रमणिका क्षेत्र में अनुपलब्ध कई प्रविष्टियों के साथ भी विफल हो जाएगी (क्योंकि वे सभी मूल्य null
साथ अनुक्रमित होंगे) जब तक कि sparse: true
निर्दिष्ट नहीं किया जाता है।
विरल सूचकांक और आंशिक सूचकांक
विरल सूचकांक:
ये उन क्षेत्रों के लिए विशेष रूप से उपयोगी हो सकते हैं जो वैकल्पिक हैं लेकिन जो अद्वितीय होने चाहिए।
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
चूंकि दो प्रविष्टियों का कोई "उपनाम" निर्दिष्ट नहीं है और अनुक्रमण अनिर्दिष्ट क्षेत्रों को अशक्त मान लेगा, इसलिए अनुक्रमणिका निर्माण 'शून्य' वाले 2 दस्तावेजों के साथ विफल हो जाएगा, इसलिए:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
आप अभी भी 'null' उपनाम रखेंगे।
स्पैर्स इंडेक्स अधिक कॉम्पैक्ट होते हैं क्योंकि वे उस फ़ील्ड को निर्दिष्ट नहीं करने वाले दस्तावेजों को छोड़ते / अनदेखा करते हैं। इसलिए यदि आपके पास एक संग्रह है जहां केवल 10% से कम दस्तावेज इस क्षेत्र को निर्दिष्ट करते हैं, तो आप बहुत छोटे सूचकांक बना सकते हैं - यदि आप प्रश्न करना चाहते हैं तो सीमित मेमोरी का बेहतर उपयोग कर सकते हैं:
db.scores.find({'nickname': 'Johnnie'})
आंशिक सूचकांक:
आंशिक सूचकांक विरल सूचकांक द्वारा की पेशकश की कार्यक्षमता का एक सुपरसेट का प्रतिनिधित्व करते हैं और विरल सूचकांक पर पसंद किया जाना चाहिए। ( संस्करण 3.2 में नया )
आंशिक सूचकांक निर्दिष्ट फ़िल्टर के आधार पर सूचकांक प्रविष्टियों को निर्धारित करते हैं।
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
यदि rating
5 से अधिक है, तो cuisine
अनुक्रमित किया जाएगा। हां, हम अन्य संपत्तियों के मूल्य के आधार पर अनुक्रमित की जाने वाली संपत्ति को भी निर्दिष्ट कर सकते हैं।
विरल और आंशिक सूचकांक के बीच अंतर:
विरल सूचकांक केवल अनुक्रमित क्षेत्र के अस्तित्व या यौगिक अनुक्रमित के लिए, अनुक्रमित क्षेत्रों के अस्तित्व के आधार पर सूचकांक करने के लिए दस्तावेजों का चयन करते हैं।
आंशिक सूचकांक निर्दिष्ट फ़िल्टर के आधार पर सूचकांक प्रविष्टियों को निर्धारित करते हैं। फ़िल्टर में इंडेक्स कुंजियों के अलावा अन्य फ़ील्ड शामिल हो सकते हैं और केवल एक अस्तित्व जाँच के अलावा अन्य शर्तों को निर्दिष्ट कर सकते हैं।
फिर भी, एक आंशिक सूचकांक एक विरल सूचकांक के समान व्यवहार को लागू कर सकता है
उदाहरण के लिए:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
नोट: एक ही समय में आंशिक फील्टरप्रेशन विकल्प और विरल विकल्प दोनों को निर्दिष्ट नहीं किया जा सकता है।