जब आप MongoDB में वाइल्डकार्ड इंडेक्स बनाते हैं, तो आपके पास एक फ़ील्ड, सभी फ़ील्ड, या बस कुछ निर्दिष्ट करने का विकल्प होता है।
आपके पास कुछ फ़ील्ड को बाहर करने का विकल्प भी है। दूसरे शब्दों में, आप छोड़कर . सभी फ़ील्ड निर्दिष्ट कर सकते हैं एक या अधिक विशिष्ट क्षेत्रों के लिए।
आप wildcardProjection
. का उपयोग कर सकते हैं वाइल्डकार्ड इंडेक्स से विशिष्ट फ़ील्ड पथ शामिल करने या निकालने के लिए पैरामीटर। यह आलेख वाइल्डकार्ड अनुक्रमणिका में विशिष्ट फ़ील्ड को बाहर करने का एक उदाहरण प्रस्तुत करता है।
उदाहरण दस्तावेज़
मान लीजिए हमारे पास pets
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "Florida Dog Awards" : "Top Dog", "New York Marathon" : "Fastest Dog", "Sumo 2020" : "Biggest Dog" } } } { "_id" : 2, "name" : "Fetch", "details" : { "born" : ISODate("2020-06-22T14:00:00Z"), "color" : "Black" } } { "_id" : 3, "name" : "Scratch", "details" : { "eats" : [ "Mouse Porridge", "Bird Soup", "Caviar" ], "type" : "Cat", "born" : ISODate("2020-12-19T14:00:00Z") } }
कुछ क्षेत्रों को छोड़कर, हम पूरे संग्रह पर वाइल्डकार्ड इंडेक्स बना सकते हैं।
इंडेक्स बनाएं
यहां एक उदाहरण दिया गया है:
db.pets.createIndex(
{ "$**" : 1 },
{
"wildcardProjection" : {
"details.awards" : 0,
"details.eats" : 0
}
}
)
आउटपुट:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
{ "$**" : 1 }
हिस्सा वह है जो वाइल्डकार्ड इंडेक्स बनाता है, और wildcardProjection
भाग वह भाग है जो निर्दिष्ट करता है कि किन क्षेत्रों को बहिष्कृत करना है। इस मामले में हमने details.awards
. को बाहर कर दिया है फ़ील्ड और details.eats
खेत। उन्हें 0
. का मान देना स्पष्ट रूप से उन्हें अनुक्रमणिका से बाहर करता है।
सूचकांक देखें
हम getIndexes()
. पर कॉल करके संग्रह पर अनुक्रमणिका देख सकते हैं विधि:
db.pets.getIndexes()
परिणाम:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "$**" : 1 }, "name" : "$**_1", "wildcardProjection" : { "details.awards" : 0, "details.eats" : 0 } } ]
हम देख सकते हैं कि दो सूचकांक हैं।
- पहला इंडेक्स
_id
पर है खेत। यह तब बनाया गया था जब संग्रह बनाया गया था (मोंगोडीबी संग्रह के निर्माण के दौरान _id फ़ील्ड पर एक अद्वितीय अनुक्रमणिका बनाता है)। - दूसरा इंडेक्स हमारा वाइल्डकार्ड इंडेक्स है। हम देख सकते हैं कि इसे स्वचालित रूप से
$**_1
. नाम दिया गया है , और इसमें वे फ़ील्ड शामिल हैं जिन्हें हमने0
. के मान के साथ निर्दिष्ट किया है , जिसका अर्थ है कि उन्हें स्पष्ट रूप से अनुक्रमणिका से बाहर रखा गया है।
सूचकांक का परीक्षण करें
हम यह देखने के लिए कुछ प्रश्न भी चला सकते हैं कि क्या हमारी अनुक्रमणिका का उपयोग किया जाएगा, और क्या बहिष्कृत फ़ील्ड वास्तव में बाहर रखे जाएंगे
निम्न क्वेरी को अनुक्रमणिका का उपयोग करना चाहिए:
db.pets.find( { "details.type" : "Dog" } )
इसे इंडेक्स का इस्तेमाल करना चाहिए क्योंकि हमने details.type
. को बाहर नहीं किया है अनुक्रमणिका से फ़ील्ड।
इसका परीक्षण करने के लिए, हम explain()
. को जोड़ सकते हैं क्वेरी योजना देखने की विधि:
db.pets.find( { "details.type" : "Dog" } ).explain()
परिणाम:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHotel.pets", "indexFilterSet" : false, "parsedQuery" : { "details.type" : { "$eq" : "Dog" } }, "queryHash" : "F1C5286F", "planCacheKey" : "5326DE93", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "$_path" : 1, "details.type" : 1 }, "indexName" : "$**_1", "isMultiKey" : false, "multiKeyPaths" : { "$_path" : [ ], "details.type" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "$_path" : [ "[\"details.type\", \"details.type\"]" ], "details.type" : [ "[\"Dog\", \"Dog\"]" ] } } }, "rejectedPlans" : [ ] }, "ok" : 1 }
हम देख सकते हैं कि इसने हमारी अनुक्रमणिका पर एक अनुक्रमणिका स्कैन (IXSCAN) का उपयोग किया है।
इसके विपरीत, जब हम बहिष्कृत फ़ील्ड में से किसी एक पर क्वेरी चलाते हैं, तो यहां क्या होता है सूचकांक से:
db.pets.find( { "details.awards.Florida Dog Awards" : "Top Dog" } ).explain()
परिणाम:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHotel.pets", "indexFilterSet" : false, "parsedQuery" : { "details.awards.Florida Dog Awards" : { "$eq" : "Top Dog" } }, "queryHash" : "16FBC17B", "planCacheKey" : "16FBC17B", "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "details.awards.Florida Dog Awards" : { "$eq" : "Top Dog" } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
इस मामले में इसने एक संग्रह स्कैन (COLLSCAN) किया, इसलिए जैसा कि अपेक्षित था, इसने अनुक्रमणिका का उपयोग नहीं किया।