जब आप 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.type" : 1,
"details.born" : 1
}
}
) आउटपुट:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
{ "$**" : 1 } हिस्सा वह है जो वाइल्डकार्ड इंडेक्स बनाता है, और wildcardProjection भाग वह भाग है जो निर्दिष्ट करता है कि किन क्षेत्रों को शामिल करना है। इस मामले में हमने details.type . शामिल किया है फ़ील्ड और details.born खेत। उन्हें 1 . का मान देना उन्हें स्पष्ट रूप से अनुक्रमणिका में शामिल करता है।
सूचकांक देखें
हम getIndexes() . पर कॉल करके संग्रह पर अनुक्रमणिका देख सकते हैं विधि:
db.pets.getIndexes() परिणाम:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"$**" : 1
},
"name" : "$**_1",
"wildcardProjection" : {
"details.type" : 1,
"details.born" : 1
}
}
] हम देख सकते हैं कि दो सूचकांक हैं।
- पहला इंडेक्स
_idपर है खेत। यह तब बनाया गया था जब संग्रह बनाया गया था (मोंगोडीबी संग्रह के निर्माण के दौरान _id फ़ील्ड पर एक अद्वितीय अनुक्रमणिका बनाता है)। - दूसरा इंडेक्स हमारा वाइल्डकार्ड इंडेक्स है। हम देख सकते हैं कि इसे स्वचालित रूप से
$**_1. नाम दिया गया है , और इसमें वे फ़ील्ड शामिल हैं जिन्हें हमने निर्दिष्ट किया है।
सूचकांक का परीक्षण करें
हम यह देखने के लिए कुछ प्रश्न भी चला सकते हैं कि हमारी अनुक्रमणिका का उपयोग किया जाएगा या नहीं।
सिद्धांत रूप में, निम्न क्वेरी को अनुक्रमणिका का उपयोग करना चाहिए:
db.pets.find( { "details.type" : "Dog" } )
इसका परीक्षण करने के लिए, हम 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.New York Marathon" : "Fastest Dog" } ).explain() परिणाम:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "PetHotel.pets",
"indexFilterSet" : false,
"parsedQuery" : {
"details.awards.New York Marathon" : {
"$eq" : "Fastest Dog"
}
},
"queryHash" : "EC0D5185",
"planCacheKey" : "EC0D5185",
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"details.awards.New York Marathon" : {
"$eq" : "Fastest Dog"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"ok" : 1
} इस मामले में इसने एक संग्रह स्कैन (COLLSCAN) किया, इसलिए जैसा कि अपेक्षित था, इसने अनुक्रमणिका का उपयोग नहीं किया।