MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में वाइल्डकार्ड इंडेक्स बनाएं

MongoDB में इंडेक्स बनाने के कई तरीके हैं, और MongoDB 4.2 से हम वाइल्डकार्ड इंडेक्स बना सकते हैं।

वाइल्डकार्ड इंडेक्स को एक तरह के फिल्टर के रूप में माना जा सकता है जो किसी संग्रह में किसी भी फ़ील्ड, उप-दस्तावेज़ या सरणी से स्वचालित रूप से मेल खाता है और फिर उन मैचों को अनुक्रमित करता है।

यह तब उपयोगी हो सकता है जब आपके दस्तावेज़ों में अलग-अलग पदानुक्रमों में अलग-अलग फ़ील्ड वाले असंरचित डेटा हों। ऐसे मामलों में, यह अनुमान लगाने का कोई तरीका नहीं है कि सूचकांक क्या होना चाहिए, क्योंकि आप नहीं जानते कि प्रत्येक दस्तावेज़ में कौन सा डेटा होगा।

वाइल्डकार्ड इंडेक्स ऐसे असंरचित डेटा के साथ उपयोगी हो सकते हैं, क्योंकि वे फ़ील्ड के सभी स्केलर मानों को अनुक्रमित करते हैं, स्वचालित रूप से किसी भी उप-दस्तावेज़ या सरणी में पुनरावर्ती होते हैं और उप-दस्तावेज़/सरणी में सभी स्केलर फ़ील्ड को अनुक्रमणित करते हैं।

उदाहरण संग्रह

वाइल्डकार्ड इंडेक्स हर संग्रह के लिए नहीं हैं। आप ऐसे दस्तावेज़ों के साथ कुछ संग्रहों पर केवल वाइल्डकार्ड अनुक्रमणिका बनाएंगे जिनमें अलग-अलग पदानुक्रमों में अलग-अलग फ़ील्ड के साथ असंरचित डेटा होता है।

नीचे 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")
	}
}

इस संग्रह के 3 दस्तावेज़ों में से प्रत्येक का एक details है फ़ील्ड, लेकिन उनमें उस फ़ील्ड के भीतर अलग-अलग फ़ील्ड होते हैं। यह सुसंगत नहीं है। यह आम तौर पर एक इंडेक्स बनाना कठिन बना देता है, क्योंकि हम नहीं जानते कि प्रत्येक दस्तावेज़ में कौन से फ़ील्ड होने जा रहे हैं। संभावित दस्तावेज़ संरचनाओं के सावधानीपूर्वक विश्लेषण के बाद, हमें संभवतः कई अनुक्रमणिकाएँ बनाने की आवश्यकता होगी।

सौभाग्य से हम वाइल्डकार्ड इंडेक्स बना सकते हैं।

लेकिन पहले, आइए देखें कि उन क्षेत्रों में से किसी एक को क्वेरी करते समय एक क्वेरी योजना कैसी दिख सकती है। कल्पना कीजिए कि हम यह पता लगाना चाहते हैं कि न्यूयॉर्क मैराथन में किस कुत्ते को "सबसे तेज़ कुत्ता" पुरस्कार मिला है। हम निम्न कार्य कर सकते हैं:

db.pets.find( { "details.awards.New York Marathon" : "Fastest Dog" } )

और अगर हम क्वेरी प्लान की जांच करना चाहते हैं, तो हम जोड़ सकते हैं explain() अंत तक:

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) करने जा रहा था, जिसका अर्थ है कि उसे फ़ील्ड की तलाश में हर दस्तावेज़ को स्कैन करना होगा।

वाइल्डकार्ड इंडेक्स बनाएं

उपरोक्त संग्रह के लिए वाइल्डकार्ड अनुक्रमणिका बनाने का एक उदाहरण यहां दिया गया है।

db.pets.createIndex({ "details.$**": 1 });

आउटपुट:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

इतना ही। वाइल्डकार्ड इंडेक्स बनाया गया है।

वाइल्डकार्ड अनुक्रमणिका बनाने के लिए हमने उस फ़ील्ड नाम का उपयोग किया जिस पर हम अनुक्रमणिका बनाना चाहते थे (इस मामले में details फ़ील्ड), फिर हमने उसे एक बिंदु (. . के साथ जोड़ दिया ), और फिर महत्वपूर्ण हिस्सा, $** भाग।

$** निर्दिष्ट करता है कि इस फ़ील्ड और उसके सभी उप-दस्तावेज़ों से वाइल्डकार्ड अनुक्रमणिका बनाई जानी चाहिए।

$** . का उपसर्ग लगाना details के साथ वाइल्डकार्ड इंडेक्स के दायरे को केवल details . तक सीमित करता है फ़ील्ड.

अब उपरोक्त क्वेरी के लिए क्वेरी प्लान की दोबारा जांच करें:

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" : "7DFA23ED",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"$_path" : 1,
					"details.awards.New York Marathon" : 1
				},
				"indexName" : "details.$**_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"$_path" : [ ],
					"details.awards.New York Marathon" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"$_path" : [
						"[\"details.awards.New York Marathon\", \"details.awards.New York Marathon\"]"
					],
					"details.awards.New York Marathon" : [
						"[\"Fastest Dog\", \"Fastest Dog\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

इस बार हमारे नए बनाए गए वाइल्डकार्ड इंडेक्स पर संग्रह स्कैन (COLLSCAN) को एक इंडेक्स स्कैन (IXSCAN) से बदल दिया गया है।

हमारे details . के भीतर प्रत्येक फ़ील्ड फ़ील्ड को पथ/मान के रूप में अनुक्रमित किया गया है, और पदानुक्रम में प्रत्येक फ़ील्ड के लिए अनुक्रमणिका में एक प्रविष्टि है। जहां फ़ील्ड मान एक उप-दस्तावेज़ है (जैसे कि हमारा awards फ़ील्ड), अनुक्रमण उप-दस्तावेज़ में उतर गया है और प्रक्रिया को दोहराया है।

सभी फ़ील्ड पथों पर वाइल्डकार्ड अनुक्रमणिका बनाना

पिछले उदाहरण में, हमने एकल फ़ील्ड पथ पर वाइल्डकार्ड अनुक्रमणिका बनाई थी। केवल $** . का उपयोग करके सभी फ़ील्ड पथों पर वाइल्डकार्ड अनुक्रमणिका बनाना संभव है इसे किसी फ़ील्ड के साथ उपसर्ग किए बिना।

उदाहरण के लिए, हम यह कर सकते थे:

db.pets.createIndex({ "$**": 1 });

इससे सभी फ़ील्ड पथों पर वाइल्डकार्ड अनुक्रमणिका बन जाती।

दरअसल, यह बिल्कुल सच नहीं है। डिफ़ॉल्ट रूप से, वाइल्डकार्ड इंडेक्स _id . पर नहीं बनाए जाते हैं खेत। _id शामिल करने के लिए फ़ील्ड, आपको इसे wildcardProjection . में शामिल करना होगा दस्तावेज़।

वाइल्डकार्ड इंडेक्स नहीं बना सकते? इस सेटिंग को जांचें।

mongod featureCompatibilityVersion कम से कम 4.2 . होना चाहिए वाइल्डकार्ड इंडेक्स बनाने के लिए।

आप इस सेटिंग को निम्न कोड से जांच सकते हैं:

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

आप इसे setFeatureCompatibilityVersion . का उपयोग करके सेट कर सकते हैं आदेश:

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

setFeatureCompatibilityVersion कमांड को admin में चलाने की जरूरत है डेटाबेस।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. योग मोंगोडब द्वारा समूह

  2. MongoDB डेटाबेस फ़ाइल का आकार कम करना

  3. MongoDB मानचित्र में चर का उपयोग कैसे करें- मानचित्र फ़ंक्शन को कम करें

  4. MongoDB:सरणी में न्यूनतम तत्व खोजें और इसे हटा दें

  5. सार्वजनिक क्षेत्र के लिए Azure सरकार का समर्थन करने वाला पहला MongoDB होस्टिंग DBaaS