DocumentDB - अनुक्रमण रिकॉर्ड्स

डिफ़ॉल्ट रूप से, DocumentDB डेटाबेस में दस्तावेज़ को जोड़ते ही दस्तावेज़ के प्रत्येक गुण को स्वचालित रूप से अनुक्रमित करता है। हालांकि, आप अपनी खुद की अनुक्रमण नीति को नियंत्रित और ठीक कर सकते हैं जो स्टोरेज और प्रसंस्करण को कम कर देता है जब विशिष्ट दस्तावेज और / या गुण होते हैं जिन्हें कभी अनुक्रमित करने की आवश्यकता नहीं होती है।

डिफ़ॉल्ट इंडेक्सिंग नीति जो डॉक्यूमेंटीडीबी को प्रत्येक संपत्ति को स्वचालित रूप से अनुक्रमित करने के लिए कहती है, कई सामान्य परिदृश्यों के लिए उपयुक्त है। लेकिन आप एक कस्टम नीति भी लागू कर सकते हैं जो वास्तव में नियंत्रित करता है कि अनुक्रमणित हो जाता है और अनुक्रमण के संबंध में क्या और अन्य कार्यक्षमता नहीं है।

DocumentDB निम्नलिखित प्रकार के अनुक्रमण का समर्थन करता है -

  • Hash
  • Range

हैश

हैश इंडेक्स समानता के लिए कुशल क्वेरी करने में सक्षम बनाता है, अर्थात, दस्तावेजों की खोज करते समय, जहां एक दी गई संपत्ति एक सटीक मान के बराबर होती है, बजाय एक मान की सीमा पर, इससे कम या अधिक से अधिक।

आप एक हैश इंडेक्स के साथ रेंज क्वेश्चन कर सकते हैं, लेकिन डॉक्यूमेंटीडीबी हैश इंडेक्स का उपयोग मैचिंग डॉक्यूमेंट्स को खोजने में नहीं कर पाएगा और इसके बजाय यह निर्धारित करने के लिए प्रत्येक डॉक्यूमेंट को स्कैन करने की जरूरत होगी कि क्या इसे रेंज क्वेरी द्वारा चुना जाना चाहिए।

आप अपने दस्तावेज़ों को ORDER BY खंड के साथ एक संपत्ति पर सॉर्ट करने में सक्षम नहीं होंगे, जिसमें सिर्फ हैश इंडेक्स है।

रेंज

संपत्ति के लिए परिभाषित रेंज इंडेक्स, डॉक्यूमेंटीडीबी कई प्रकार के मूल्यों के खिलाफ दस्तावेजों के लिए कुशलतापूर्वक क्वेरी करने की अनुमति देता है। यह आपको ORDER BY का उपयोग करके उस संपत्ति पर क्वेरी परिणामों को क्रमबद्ध करने की अनुमति भी देता है।

DocumentDB आपको किसी भी या सभी गुणों पर हैश और रेंज इंडेक्स दोनों को परिभाषित करने की अनुमति देता है, जो कुशल समानता और श्रेणी के प्रश्नों को सक्षम करता है, साथ ही साथ ORDER BY।

अनुक्रमण नीति

प्रत्येक संग्रह में एक अनुक्रमण नीति होती है जो यह निर्धारित करती है कि प्रत्येक दस्तावेज़ की प्रत्येक संपत्ति में संख्याओं और तारों के लिए किस प्रकार के सूचकांक का उपयोग किया जाता है।

  • आप यह भी नियंत्रित कर सकते हैं कि संग्रह में जोड़े जाने के साथ दस्तावेज़ स्वचालित रूप से अनुक्रमित हो जाते हैं या नहीं।

  • स्वचालित अनुक्रमण डिफ़ॉल्ट रूप से सक्षम है, लेकिन आप दस्तावेज़ को जोड़ते समय उस व्यवहार को ओवरराइड कर सकते हैं, डॉक्यूमेंटीडीबी को उस विशेष दस्तावेज़ को अनुक्रमणित नहीं करने के लिए कह सकते हैं।

  • आप स्वचालित अनुक्रमण को अक्षम कर सकते हैं ताकि डिफ़ॉल्ट रूप से, संग्रह में जोड़े जाने पर दस्तावेज़ अनुक्रमित न हों। इसी तरह, आप इसे दस्तावेज़ स्तर पर ओवरराइड कर सकते हैं और संग्रह में जोड़ते समय किसी विशेष दस्तावेज़ को अनुक्रमित करने के लिए DocumentDB को निर्देश दे सकते हैं। इसे मैनुअल इंडेक्सिंग के रूप में जाना जाता है।

शामिल करें / बहिष्कृत अनुक्रमण करें

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

इन मामलों में, आप संग्रह में जोड़े गए प्रत्येक दस्तावेज़ के उन विशेष भागों को अनुक्रमित करने के लिए DocumentDB को बताकर इंडेक्सिंग ओवरहेड को कम कर सकते हैं।

स्वचालित अनुक्रमण

आइए स्वचालित अनुक्रमण के एक सरल उदाहरण पर एक नज़र डालें।

Step 1 - पहले हम ऑटिंडेक्सिंग नामक एक संग्रह बनाते हैं और स्पष्ट रूप से किसी नीति की आपूर्ति किए बिना, यह संग्रह डिफ़ॉल्ट अनुक्रमण नीति का उपयोग करता है, जिसका अर्थ है कि इस संग्रह पर स्वचालित अनुक्रमण सक्षम है।

यहां हम डेटाबेस सेल्फ-लिंक के लिए आईडी-आधारित रूटिंग का उपयोग कर रहे हैं, इसलिए हमें संग्रह बनाने से पहले इसके संसाधन आईडी या क्वेरी को जानने की आवश्यकता नहीं है। हम सिर्फ डेटाबेस आईडी का उपयोग कर सकते हैं, जो कि mydb है।

Step 2 - अब दो दस्तावेज बनाते हैं, दोनों उपस्टोन के अंतिम नाम के साथ।

private async static Task AutomaticIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Override Automatic Indexing ****");

   // Create collection with automatic indexing

   var collectionDefinition = new DocumentCollection {
      Id = "autoindexing"
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);

   // Add a document (indexed)
   dynamic indexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", indexedDocumentDefinition);
		
   // Add another document (request no indexing)
   dynamic unindexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", unindexedDocumentDefinition,
      new RequestOptions { IndexingDirective = IndexingDirective.Exclude });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing", "SELECT *
      FROM c WHERE c.lastName = 'Doe'").ToList();
		
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);

   // Unindexed document will get returned when using no WHERE clause

   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document janeDoc = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c WHERE c.id = 'JANE'").AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", janeDoc.SelfLink);
	
   // Delete the collection
	
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/autoindexing");
}

मार्क उपस्टोन के लिए यह पहला एक संग्रह में जोड़ा जाता है और फिर डिफ़ॉल्ट अनुक्रमण नीति के आधार पर तुरंत स्वचालित रूप से अनुक्रमित किया जाता है।

लेकिन जब मार्क अपस्टोन के लिए दूसरा दस्तावेज़ जोड़ा जाता है, तो हमने IndexingDirective.Exclude के साथ अनुरोध विकल्प पारित किए हैं, जो स्पष्ट रूप से डॉक्यूमेंटडीबी को निर्देश देता है कि संग्रह की अनुक्रमण नीति के बावजूद, इस दस्तावेज़ को अनुक्रमित न करें।

अंत में दोनों दस्तावेजों के लिए हमारे पास विभिन्न प्रकार के प्रश्न हैं।

Step 3 - CreateDocumentClient से ऑटोमैटिकइंडेक्सिंग कार्य को कॉल करते हैं।

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      await AutomaticIndexing(client); 
   } 
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो आपको निम्न आउटपुट प्राप्त होगा।

**** Override Automatic Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oAOEkfQA=/docs/kV5oAOEkfQACA 
AAAAAAAAA==/

जैसा कि आप देख सकते हैं कि हमारे पास दो ऐसे दस्तावेज़ हैं, लेकिन क्वेरी केवल एक मार्क के लिए वापस आती है क्योंकि मार्क के लिए कोई अनुक्रमित नहीं है। यदि हम फिर से क्वेरी करते हैं, तो संग्रह में सभी दस्तावेज़ों को पुनः प्राप्त करने के लिए WHERE क्लॉज के बिना, तो हमें दोनों दस्तावेज़ों के साथ एक परिणाम प्राप्त होता है और इसका कारण यह है कि बिना दस्तावेज वाले प्रश्नों को हमेशा उन प्रश्नों द्वारा लौटाया जाता है जिनका कोई खंड नहीं है।

हम उनकी आईडी या सेल्फ-लिंक द्वारा अनइंस्टॉल किए गए दस्तावेजों को भी प्राप्त कर सकते हैं। इसलिए जब हम मार्क के दस्तावेज़ के लिए उसकी ID, MARK से क्वेरी करते हैं, तो हम देखते हैं कि DocumentDB दस्तावेज़ को वापस कर देता है, हालांकि यह संग्रह में अनुक्रमित नहीं है।

मैनुअल अनुक्रमण

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

Step 1- पहले हम मैन्युअलइंडेक्सिंग नामक एक संग्रह बनाएंगे और स्वचालित अनुक्रमण को स्पष्ट रूप से अक्षम करके डिफ़ॉल्ट नीति को ओवरराइड करेंगे। इसका मतलब यह है कि, जब तक हम अन्यथा अनुरोध नहीं करते हैं, इस संग्रह में जोड़े गए नए दस्तावेजों को अनुक्रमित नहीं किया जाएगा।

private async static Task ManualIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Manual Indexing ****");
   // Create collection with manual indexing

   var collectionDefinition = new DocumentCollection {
      Id = "manualindexing",
      IndexingPolicy = new IndexingPolicy {
         Automatic = false,
      },
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);
		
   // Add a document (unindexed)
   dynamic unindexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   }; 
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/manualindexing", unindexedDocumentDefinition);
  
   // Add another document (request indexing)
   dynamic indexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client.CreateDocumentAsync
      ("dbs/mydb/colls/manualindexing", indexedDocumentDefinition, new RequestOptions {
      IndexingDirective = IndexingDirective.Include });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.lastName = 'Doe'").ToList();
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);
	
   // Unindexed document will get returned when using no WHERE clause
	
   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document markDoc = client
      .CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.id = 'MARK'")
      .AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", markDoc.SelfLink);
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/manualindexing");
}

Step 2- अब हम फिर से पहले की तरह ही दो दस्तावेज बनाएंगे। हम इस बार मार्क के दस्तावेज़ के लिए किसी विशेष अनुरोध विकल्प की आपूर्ति नहीं करेंगे, क्योंकि संग्रह की अनुक्रमण नीति के कारण, इस दस्तावेज़ को अनुक्रमित नहीं किया जाएगा।

Step 3 - अब जब हम मार्क के लिए दूसरा दस्तावेज़ जोड़ते हैं, तो हम IndexingDirective.Include के साथ RequestOptions का उपयोग करके डॉक्यूमेंटीडी को यह बताने के लिए कहते हैं कि इसे इस दस्तावेज़ को अनुक्रमित करना चाहिए, जो संग्रह की अनुक्रमण नीति को ओवरराइड करता है जो कहता है कि इसे नहीं करना चाहिए।

अंत में दोनों दस्तावेजों के लिए हमारे पास विभिन्न प्रकार के प्रश्न हैं।

Step 4 - CreateDocumentClient से ManualIndexing कार्य को कॉल करते हैं।

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
      await ManualIndexing(client); 
   } 
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो आपको निम्न आउटपुट प्राप्त होगा।

**** Manual Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oANHJPgE=/docs/kV5oANHJPgEBA 
AAAAAAAAA==/

फिर से, क्वेरी केवल दो दस्तावेजों में से एक को लौटाती है, लेकिन इस बार, यह जेन डो को वापस कर देती है, जिसे हमने स्पष्ट रूप से अनुक्रमित करने का अनुरोध किया है। लेकिन पहले की तरह फिर से, बिना WHERE क्लॉज के क्वैक्शन लेने पर मार्क के लिए अनइंस्टॉल्ड डॉक्यूमेंट सहित कलेक्शन के सभी डॉक्यूमेंट्स फिर से मिल जाते हैं। हम इसकी आईडी द्वारा अनइन्डेक्स किए गए दस्तावेज़ के लिए क्वेरी भी कर सकते हैं, जो कि डॉक्यूमेंटीडीबी अनुक्रमित नहीं होने के बावजूद वापस लौटता है।