इंडेक्स की खास जानकारी

इस सेक्शन में, Firestore Enterprise वर्शन के लिए इंडेक्स करने के बारे में बताया गया है. Firestore Enterprise वर्शन, डिफ़ॉल्ट रूप से कोई इंडेक्स नहीं बनाता. लागत कम करने और डेटाबेस की परफ़ॉर्मेंस को बेहतर बनाने के लिए, सबसे ज़्यादा इस्तेमाल की जाने वाली क्वेरी के लिए इंडेक्स बनाएं.

इंडेक्स का डेटाबेस की परफ़ॉर्मेंस पर काफ़ी असर पड़ता है. अगर किसी क्वेरी के लिए इंडेक्स मौजूद है, तो डेटाबेस बेहतर तरीके से नतीजे दिखा सकता है. इसके लिए, वह स्कैन किए जाने वाले डेटा की मात्रा को कम करता है और नतीजों को क्रम से लगाने के लिए ज़रूरी काम को कम करता है. हालांकि, इंडेक्स एंट्री की वजह से स्टोरेज की लागत बढ़ जाती है. साथ ही, इंडेक्स किए गए फ़ील्ड पर डेटा लिखने की प्रोसेस के दौरान, काम की मात्रा भी बढ़ जाती है.

इंडेक्स की परिभाषा और स्ट्रक्चर

इंडेक्स में ये शामिल होते हैं:

  • कलेक्शन आईडी
  • दिए गए कलेक्शन में मौजूद फ़ील्ड की सूची
  • हर फ़ील्ड के लिए इंडेक्स मोड, जो बढ़ते क्रम में, घटते क्रम में या कलेक्शन में शामिल हो सकता है

इंडेक्स, स्पार्स या यूनीक विकल्पों को भी चालू कर सकता है.

इंडेक्स का क्रम

हर फ़ील्ड का क्रम और क्रम से लगाने की दिशा, इंडेक्स को खास तौर पर तय करती है. उदाहरण के लिए, यहां दिए गए इंडेक्स दो अलग-अलग इंडेक्स हैं और इन्हें एक-दूसरे की जगह इस्तेमाल नहीं किया जा सकता:

कलेक्शन फ़ील्ड
शहर देश (बढ़ते क्रम में), जनसंख्या (घटते क्रम में)
शहर जनसंख्या (घटते क्रम में), देश (बढ़ते क्रम में),

किसी क्वेरी के लिए इंडेक्स बनाते समय, फ़ील्ड को उसी क्रम में शामिल करें जिस क्रम में वे आपकी क्वेरी में हैं.

इंडेक्स डेंसिटी

डिफ़ॉल्ट रूप से, इंडेक्स एंट्री में किसी कलेक्शन के सभी दस्तावेज़ों का डेटा सेव होता है. इसे नॉन-स्पार्स इंडेक्स कहा जाता है. किसी दस्तावेज़ के लिए इंडेक्स एंट्री जोड़ी जाएगी. इससे कोई फ़र्क़ नहीं पड़ता कि दस्तावेज़ में इंडेक्स में बताए गए फ़ील्ड में से कोई फ़ील्ड मौजूद है या नहीं. इंडेक्स एंट्री जनरेट करते समय, मौजूद नहीं होने वाले फ़ील्ड को NULL वैल्यू वाला माना जाता है. इस व्यवहार को बदलने के लिए, इंडेक्स को स्पार्स इंडेक्स के तौर पर तय किया जा सकता है.

स्पार्स इंडेक्स

स्पार्स इंडेक्स, कलेक्शन में मौजूद सिर्फ़ उन दस्तावेज़ों को इंडेक्स करता है जिनमें इंडेक्स किए गए कम से कम एक फ़ील्ड के लिए कोई वैल्यू (इसमें शून्य भी शामिल है) मौजूद हो. स्पार्स इंडेक्स से स्टोरेज की लागत कम होती है और परफ़ॉर्मेंस बेहतर हो सकती है.

ऐरे-कंटेन इंडेक्स

array-contains या array-contains-any का इस्तेमाल करके, किसी कलेक्शन फ़ील्ड के लिए क्वेरी करते समय क्वेरी की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, फ़ील्ड को array-contains मोड में इंडेक्स किया जा सकता है. किसी इंडेक्स में, array-contains मोड में ज़्यादा से ज़्यादा एक फ़ील्ड हो सकता है.

array-contains मोड में ऐरे फ़ील्ड को इंडेक्स करके, क्वेरी इंजन खास ऐरे वैल्यू वाले दस्तावेज़ों को तुरंत ढूंढ सकता है. इंडेक्स के बिना, क्वेरी कलेक्शन को पूरी तरह से स्कैन करके, कलेक्शन में मौजूद अरे की वैल्यू की जांच करती हैं. इससे कलेक्शन का साइज़ बढ़ने पर, क्वेरी के इंतज़ार का समय और डेटा को पढ़ने की लागत बढ़ जाती है.

किसी ऐरे फ़ील्ड को इंडेक्स करने के लिए, फ़ील्ड को यह ज़रूरी शर्त पूरी करनी होगी:

  • ऐरे खाली नहीं होना चाहिए: इंडेक्स एंट्री सिर्फ़ तब बनाई जाती है, जब दस्तावेज़ में ऐरे फ़ील्ड मौजूद हो और वह खाली न हो. ऐसे दस्तावेज़ों को इंडेक्स नहीं किया जाता जिनमें अरे फ़ील्ड मौजूद नहीं होते, अरे फ़ील्ड नहीं होते या अरे फ़ील्ड खाली होते हैं.

डेंसिटी, array-contains इंडेक्स से कैसे जुड़ी है

array-contains फ़ील्ड वाले इंडेक्स के लिए, इंडेक्स डेंसिटी के नियम सिर्फ़ क्रम से लगाए गए इंडेक्स किए गए फ़ील्ड पर लागू होते हैं. अगर खाली न होने वाले कलेक्शन की शर्त पूरी होती है, तो इंडेक्स में मौजूद बाकी इंडेक्स किए गए फ़ील्ड पर डेंसिटी के नियम लागू होते हैं:

  • नॉन-स्पार्स इंडेक्स (DENSE): दस्तावेज़ के लिए एक इंडेक्स एंट्री जनरेट की जाती है. इंडेक्स में मौजूद, इंडेक्स किए गए ऐसे फ़ील्ड जो क्रम में नहीं हैं उन्हें इंडेक्स एंट्री में null के तौर पर सेव किया जाता है.
  • स्पार्स इंडेक्स (SPARSE): इंडेक्स एंट्री सिर्फ़ तब जनरेट होती है, जब दस्तावेज़ में इंडेक्स किए गए फ़ील्ड में से कम से कम एक फ़ील्ड मौजूद हो.

उदाहरण: इंडेक्स एंट्री जनरेट करना

इंडेक्स users (tags[*], status ASC) पर ध्यान दें:

दस्तावेज़ NON-SPARSE इंडेक्स SPARSE इंडेक्स
{
  tags: ["news"],
  status: "active"
}
इंडेक्स किया गया:
• (टैग: "news", स्थिति: "active")
इंडेक्स किया गया:
• (टैग: "news", स्थिति: "active")
{
  tags: ["news", "sports"],
  status: "active"
}
Indexed:
• (tags: "news", status: "active")
• (tags: "sports", status: "active")
Indexed:
• (tags: "news", status: "active")
• (tags: "sports", status: "active")
{
  tags: ["news", "news"],
  status: "active"
}
इंडेक्स किया गया:
• (टैग: "news", स्थिति: "active") (डुप्लीकेट कॉपी हटाई गई)
इंडेक्स किया गया:
• (टैग: "news", स्थिति: "active") (डुप्लीकेट कॉपी हटाई गई)
{
  tags: [null],
  status: "active"
}
इंडेक्स किया गया:
• (टैग: null, स्थिति: "active")
इंडेक्स किया गया:
• (टैग: null, स्थिति: "active")
{
  tags: ["news"]
}
इंडेक्स किया गया:
• (टैग: "news", स्थिति: null)
इंडेक्स नहीं किया गया (status फ़ील्ड मौजूद नहीं है)
{
  tags: "news",
  status: "active"
}
इंडेक्स नहीं किया गया (फ़ील्ड, कलेक्शन नहीं है) इंडेक्स नहीं किया गया (फ़ील्ड, कलेक्शन नहीं है)
{
  tags: null,
  status: "active"
}
इंडेक्स नहीं किया गया (फ़ील्ड, कलेक्शन नहीं है) इंडेक्स नहीं किया गया (फ़ील्ड, कलेक्शन नहीं है)
{
  status: "active"
}
इंडेक्स नहीं किया गया (tags फ़ील्ड मौजूद नहीं है) इंडेक्स नहीं किया गया (tags फ़ील्ड मौजूद नहीं है)
{
  tags: [],
  status: "active"
}
इंडेक्स नहीं किया गया (खाली कलेक्शन) इंडेक्स नहीं किया गया (खाली कलेक्शन)

क्वेरी का उदाहरण

वेब
// Query for users where 'tags' contains 'news' and 'status' is 'active'
const query = db.collection("users")
  .where("tags", "array-contains", "news")
  .where("status", "==", "active");

// Documents returned by the query:
// [
//   {
//     "id": "alice",
//     "tags": ["news", "tech"],
//     "status": "active"
//   }
// ]

यूनीक इंडेक्स

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

यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड

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

उदाहरण के लिए, इस इंडेक्स के साथ:

कलेक्शन इंडेक्स किए गए फ़ील्ड क्वेरी का दायरा
शहर नाम (बढ़ते क्रम में) कलेक्शन

अगर कलेक्शन में दस्तावेज़ {"abbreviation": "LA"} जोड़ा जाता है, तो यूनीक इंडेक्स, name को null पर सेट करके एक एंट्री बनाता है. इसके बाद, अगर दस्तावेज़ {"abbreviation": "NYC"} को जोड़ने की कोशिश की जाती है, तो कार्रवाई पूरी नहीं हो पाती. ऐसा इसलिए होता है, क्योंकि यूनीक इंडेक्स के लिए मिलने वाली एंट्री एक जैसी होती है.

एक से ज़्यादा फ़ील्ड वाले यूनीक इंडेक्स पर भी यही व्यवहार लागू होता है. कोई दस्तावेज़ बनाते या अपडेट करते समय, इंडेक्स किए गए जो फ़ील्ड मौजूद नहीं होते हैं उन्हें null पर सेट किया जाता है. साथ ही, इंडेक्स में मौजूद एंट्री, इंडेक्स में यूनीक होनी चाहिए.

अरे वैल्यू पर यूनीक इंडेक्स

यूनीक array-contains इंडेक्स, ओवरलैप होने वाले कलेक्शन एलिमेंट वाले दस्तावेज़ों को रोकता है.

इस तरह का इंडेक्स, यह लागू नहीं करता कि किसी ऐरे में एक ही दस्तावेज़ में यूनीक वैल्यू हों.

उदाहरण के लिए, tags नाम के फ़ील्ड पर यूनीक इंडेक्स के साथ:

doc1 दस्तावेज़ को शामिल किया जा सकता है:

{
  "tags": [ "news", "tech", "news", "music" ]
}

इंडेक्स, एक ही दस्तावेज़ के एक ही कलेक्शन में डुप्लीकेट वैल्यू ("news") की अनुमति देता है.

अगर डुप्लीकेट एलिमेंट वाले दूसरे दस्तावेज़, doc2 को डालने की कोशिश की जाती है, तो कार्रवाई पूरी नहीं होती:

{
  "tags": [ "sports", "music" ]
}

कार्रवाई पूरी नहीं हो सकी, क्योंकि "music" पहले से ही doc1 के कलेक्शन में मौजूद है और इंडेक्स में मैप किया गया है.

अगर आपको यह पक्का करना है कि किसी एक दस्तावेज़ में एक ही कलेक्शन के एलिमेंट यूनीक हों, तो इसे अपने ऐप्लिकेशन लॉजिक में मैनेज करें.

खाली ऐरे, मौजूद नहीं होने वाले फ़ील्ड, और शून्य वैल्यू

आम तौर पर, यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड को null के तौर पर माना जाता है. साथ ही, ये सभी दस्तावेज़ों में यूनीक होने चाहिए. इसके बारे में ज़्यादा जानने के लिए, यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड देखें. हालांकि, अरे फ़ील्ड पर यूनीक इंडेक्स के लिए:

  • खाली ऐरे, मौजूद नहीं होने वाले फ़ील्ड, और स्टैंडअलोन शून्य: अगर ऐरे फ़ील्ड खाली है, पूरी तरह से मौजूद नहीं है या उसमें स्टैंडअलोन null वैल्यू (ऐरे के अंदर नहीं) है, तो दस्तावेज़ के लिए कोई इंडेक्स कुंजी जनरेट नहीं होती है. इसलिए, डुप्लीकेट कुंजी की गड़बड़ियों को ट्रिगर किए बिना, कई दस्तावेज़ों में खाली फ़ील्ड या अलग से मौजूद null वैल्यू हो सकती हैं.
  • अरे में मौजूद शून्य एलिमेंट: अगर अरे में एलिमेंट के तौर पर null वैल्यू मौजूद है (उदाहरण के लिए, ["news", null]), तो null एलिमेंट को इंडेक्स किया जाता है. अगर किसी दस्तावेज़ के इंडेक्स किए गए कलेक्शन फ़ील्ड में null एलिमेंट मौजूद है, तो डुप्लीकेट कुंजी की गड़बड़ी की वजह से वह दस्तावेज़ इंडेक्स नहीं हो पाएगा.

इंडेक्स बनाने में आने वाली गड़बड़ियों को ठीक करना

इंडेक्स मैनेज करते समय, आपको इंडेक्स बनाने से जुड़ी गड़बड़ियां दिख सकती हैं. अगर डेटाबेस को डेटा में कोई समस्या मिलती है, तो इंडेक्स करने की प्रोसेस पूरी नहीं हो पाती. इंडेक्स करने की प्रोसेस इन वजहों से पूरी नहीं हो पाती:

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

आगे क्या करना है

इंडेक्स बनाने और उन्हें मैनेज करने का तरीका जानें.