इस पेज पर, Cloud Firestore को इंडेक्स करने के बारे में बताया गया है. Cloud Firestore, डिफ़ॉल्ट रूप से कोई इंडेक्स नहीं बनाता. डेटाबेस की परफ़ॉर्मेंस को बेहतर बनाने के लिए, सबसे ज़्यादा इस्तेमाल की जाने वाली क्वेरी के लिए इंडेक्स बनाएं.
इंडेक्स का डेटाबेस की परफ़ॉर्मेंस पर काफ़ी असर पड़ता है. अगर किसी क्वेरी के लिए इंडेक्स मौजूद है, तो डेटाबेस बेहतर तरीके से नतीजे दिखा सकता है. इसके लिए, वह स्कैन किए जाने वाले डेटा की मात्रा को कम करता है और नतीजों को क्रम से लगाने के लिए ज़रूरी काम को कम करता है. हालांकि, इंडेक्स एंट्री की वजह से स्टोरेज की लागत बढ़ जाती है. साथ ही, इंडेक्स किए गए फ़ील्ड पर डेटा लिखने की प्रोसेस के दौरान, काम की मात्रा भी बढ़ जाती है.
इंडेक्स की परिभाषा और स्ट्रक्चर
इंडेक्स में ये शामिल होते हैं:
- कलेक्शन आईडी
- दिए गए कलेक्शन में मौजूद फ़ील्ड की सूची
- हर फ़ील्ड के लिए, बढ़ते या घटते क्रम में
इंडेक्स में sparse, मल्टीकी या यूनीक विकल्प भी चालू किए जा सकते हैं.
इंडेक्स का क्रम
हर फ़ील्ड का क्रम और क्रम से लगाने की दिशा, इंडेक्स को खास तौर पर तय करती है. उदाहरण के लिए, यहां दिए गए इंडेक्स दो अलग-अलग इंडेक्स हैं और इन्हें एक-दूसरे की जगह इस्तेमाल नहीं किया जा सकता:
| कलेक्शन | फ़ील्ड |
|---|---|
| शहर | देश (बढ़ते क्रम में), जनसंख्या (घटते क्रम में) |
| शहर | जनसंख्या (घटते क्रम में), देश (बढ़ते क्रम में), |
किसी क्वेरी के लिए इंडेक्स बनाते समय, फ़ील्ड को उसी क्रम में शामिल करें जिस क्रम में वे आपकी क्वेरी में हैं.
इंडेक्स डेंसिटी
डिफ़ॉल्ट रूप से, इंडेक्स एंट्री में किसी कलेक्शन के सभी दस्तावेज़ों का डेटा सेव होता है. इसे नॉन-स्पार्स इंडेक्स कहा जाता है. किसी दस्तावेज़ के लिए इंडेक्स एंट्री जोड़ी जाएगी. भले ही, दस्तावेज़ में इंडेक्स में बताए गए फ़ील्ड में से कोई फ़ील्ड शामिल हो या नहीं. इंडेक्स एंट्री जनरेट करते समय, मौजूद नहीं होने वाले फ़ील्ड को NULL वैल्यू वाला माना जाता है. इस व्यवहार को बदलने के लिए, इंडेक्स को स्पार्स इंडेक्स के तौर पर तय किया जा सकता है.
स्पार्स इंडेक्स
स्पार्स इंडेक्स, कलेक्शन में मौजूद सिर्फ़ उन दस्तावेज़ों को इंडेक्स करता है जिनमें इंडेक्स किए गए कम से कम एक फ़ील्ड के लिए कोई वैल्यू (इसमें शून्य भी शामिल है) मौजूद हो. स्पार्स इंडेक्स से स्टोरेज की लागत कम होती है और परफ़ॉर्मेंस बेहतर हो सकती है.
अरे वैल्यू के लिए मल्टीकी इंडेक्स
अगर किसी ऐसे फ़ील्ड पर इंडेक्स बनाया जा रहा है जिसमें कलेक्शन वैल्यू शामिल हैं, तो आपको मल्टीकी इंडेक्स बनाना होगा. सामान्य इंडेक्स, अरे वैल्यू को इंडेक्स नहीं कर सकता. मल्टीकी इंडेक्स, इंडेक्स की परिभाषा में ज़्यादा से ज़्यादा एक अरे फ़ील्ड के साथ काम करता है. इसका इस्तेमाल, अरे वैल्यू को ट्रैवर्स करने वाले ऑपरेशन के लिए किया जा सकता है.
मल्टीकी इंडेक्स का इस्तेमाल सिर्फ़ तब करें, जब आपको पता हो कि अरे वैल्यू को इंडेक्स करना है. किसी क्वेरी को प्रोसेस करते समय, रेगुलर इंडेक्स के फ़ायदे होते हैं. उदाहरण के लिए, रेगुलर इंडेक्स, किसी रेंज में मौजूद वैल्यू को ज़्यादा बेहतर तरीके से फ़िल्टर कर सकते हैं.
अरे वैल्यू और मल्टीकी इंडेक्स के साथ काम करते समय, इन स्थितियों में गड़बड़ियां होती हैं:
- कोई कार्रवाई, सामान्य इंडेक्स से इंडेक्स किए गए फ़ील्ड में अरे वैल्यू जोड़ने की कोशिश करती है. ऐरे वैल्यू जोड़ने के लिए, आपको उस फ़ील्ड पर मौजूद सामान्य इंडेक्स मिटाने होंगे. इसके बाद, उन्हें मल्टीकी इंडेक्स के तौर पर फिर से बनाना होगा.
- आपने किसी ऐसे फ़ील्ड पर सामान्य इंडेक्स बनाने की कोशिश की है जिसमें अरे वैल्यू शामिल है. आपको मल्टीकी इंडेक्स बनाना होगा या कलेक्शन की वैल्यू मिटानी होंगी.
- किसी कार्रवाई के तहत, अरे वैल्यू वाले कई फ़ील्ड को इंडेक्स करने की कोशिश की जाती है. मल्टीकी इंडेक्स में, अरे वैल्यू वाला एक से ज़्यादा फ़ील्ड नहीं हो सकता. आगे बढ़ने के लिए, अपने डेटा मॉडल या इंडेक्स की परिभाषाओं में बदलाव करें.
- आपने एक ऐसा मल्टीकी इंडेक्स बनाने की कोशिश की है जिसमें दो फ़ील्ड पाथ, एक ही प्रीफ़िक्स शेयर करते हैं. जैसे,
users.postsऔरusers.zip.
यूनीक इंडेक्स
इंडेक्स किए गए फ़ील्ड के लिए यूनीक वैल्यू लागू करने के लिए, यूनीक इंडेक्स का विकल्प सेट करें. एक से ज़्यादा फ़ील्ड पर इंडेक्स के लिए, वैल्यू का हर कॉम्बिनेशन पूरे इंडेक्स में यूनीक होना चाहिए. डेटाबेस, अपडेट और इंसर्ट करने की ऐसी किसी भी कार्रवाई को अस्वीकार कर देता है जो डुप्लीकेट वैल्यू वाली इंडेक्स एंट्री बनाने की कोशिश करती है. अगर इंडेक्स किए गए फ़ील्ड के डेटा में डुप्लीकेट वैल्यू मौजूद हैं और आपने यूनीक इंडेक्स बनाने की कोशिश की है, तो इंडेक्स बनाने की प्रोसेस पूरी नहीं हो पाएगी. साथ ही, कार्रवाई की जानकारी में गड़बड़ी का मैसेज दिखेगा.
यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड
अगर आपने यूनीक इंडेक्स के लिए, फ़ील्ड मौजूद न होने वाला कोई दस्तावेज़ डाला है, तो इंडेक्स, मौजूद न होने वाले फ़ील्ड के लिए null वैल्यू सेट करता है. नतीजे के तौर पर मिलने वाली इंडेक्स एंट्री यूनीक होनी चाहिए. ऐसा न होने पर, कार्रवाई पूरी नहीं होगी.
उदाहरण के लिए, इस इंडेक्स के साथ:
db.cities.createIndex( { "name": 1 }, { unique: true } )
अगर कलेक्शन में दस्तावेज़ {"abbreviation": "LA"} जोड़ा जाता है, तो यूनीक इंडेक्स, name को null पर सेट करके एक एंट्री बनाता है. इसके बाद, अगर दस्तावेज़ {"abbreviation": "NYC"} को जोड़ने की कोशिश की जाती है, तो कार्रवाई पूरी नहीं हो पाती. ऐसा इसलिए होता है, क्योंकि यूनीक इंडेक्स के लिए मिलने वाली एंट्री एक जैसी होती है.
एक से ज़्यादा फ़ील्ड वाले यूनीक इंडेक्स पर भी यही व्यवहार लागू होता है.
कोई दस्तावेज़ बनाते या अपडेट करते समय, इंडेक्स किए गए जो फ़ील्ड मौजूद नहीं होते हैं उन्हें null पर सेट किया जाता है. साथ ही, इंडेक्स में मौजूद एंट्री, इंडेक्स में यूनीक होनी चाहिए.
अरे वैल्यू पर यूनीक इंडेक्स
यूनीक मल्टीकी इंडेक्स का इस्तेमाल करके, यह पक्का किया जा सकता है कि दस्तावेज़ों में अरे एलिमेंट ओवरलैप न हों.
इस तरह का इंडेक्स, यह लागू नहीं करता कि किसी ऐरे में एक ही दस्तावेज़ में यूनीक वैल्यू हों.
उदाहरण के लिए, यूनीक इंडेक्स के साथ:
db.collection.createIndex( { "tags": 1 }, { unique: true } )
इस दस्तावेज़ को शामिल किया जा सकता है:
{
"_id": 1,
"tags": [ "news", "tech", "news", "music" ]
}
इंडेक्स, एक ही दस्तावेज़ के एक ही कलेक्शन में डुप्लीकेट वैल्यू ("news") की अनुमति देता है.
अगर डुप्लीकेट एलिमेंट वाले किसी दूसरे दस्तावेज़ को शामिल करने की कोशिश की जाती है, तो कार्रवाई पूरी नहीं हो पाती:
{
"_id": 2,
"tags": [ "sports", "music" ]
}
कार्रवाई पूरी नहीं हो सकी, क्योंकि "music" पहले से ही दस्तावेज़ 1 के कलेक्शन में मौजूद है और इंडेक्स में मैप किया गया है.
अगर आपको यह पक्का करना है कि किसी एक दस्तावेज़ में एक ही कलेक्शन के एलिमेंट यूनीक हों, तो अपने ऐप्लिकेशन लॉजिक में इसे मैनेज करें. इसके लिए, $push के बजाय $addToSet जैसे अपडेट करने वाले ऑपरेटर का इस्तेमाल करें.
खाली ऐरे, मौजूद नहीं होने वाले फ़ील्ड, और शून्य वैल्यू
आम तौर पर, यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड को null के तौर पर माना जाता है. साथ ही, ये सभी दस्तावेज़ों में यूनीक होने चाहिए. इसके बारे में ज़्यादा जानने के लिए, यूनीक इंडेक्स में मौजूद नहीं होने वाले फ़ील्ड देखें.
हालांकि, अरे फ़ील्ड पर यूनीक इंडेक्स के लिए:
- खाली ऐरे, मौजूद नहीं होने वाले फ़ील्ड, और स्टैंडअलोन शून्य: अगर ऐरे फ़ील्ड खाली है, पूरी तरह से मौजूद नहीं है या उसमें स्टैंडअलोन
nullवैल्यू (ऐरे के अंदर नहीं) है, तो दस्तावेज़ के लिए कोई इंडेक्स कुंजी जनरेट नहीं होती है. इसलिए, डुप्लीकेट कुंजी की गड़बड़ियों को ट्रिगर किए बिना, कई दस्तावेज़ों में खाली फ़ील्ड या अलग से मौजूदnullवैल्यू हो सकती हैं. - अरे में मौजूद शून्य एलिमेंट: अगर अरे में एलिमेंट के तौर पर
nullवैल्यू मौजूद है (उदाहरण के लिए,["news", null]), तोnullएलिमेंट को इंडेक्स किया जाता है. अगर किसी दस्तावेज़ के इंडेक्स किए गए कलेक्शन फ़ील्ड मेंnullएलिमेंट मौजूद है, तो डुप्लीकेट कुंजी की गड़बड़ी की वजह से वह दस्तावेज़ इंडेक्स नहीं हो पाएगा.
टीटीएल इंडेक्स
अपने डेटाबेस से पुराने डेटा को अपने-आप हटाने के लिए, टीटीएल इंडेक्स का इस्तेमाल करें. टीटीएल इंडेक्स, किसी फ़ील्ड को किसी कलेक्शन में मौजूद दस्तावेज़ों की समयसीमा खत्म होने के समय के तौर पर तय करता है. टीटीएल की मदद से, पुराने डेटा को मिटाकर स्टोरेज की लागत कम की जा सकती है. आम तौर पर, डेटा की समयसीमा खत्म होने के 24 घंटों के अंदर उसे मिटा दिया जाता है.
इंडेक्स बनाने में आने वाली गड़बड़ियों को ठीक करना
इंडेक्स मैनेज करते समय, आपको इंडेक्स बनाने से जुड़ी गड़बड़ियां दिख सकती हैं. अगर डेटाबेस को डेटा में कोई समस्या मिलती है, तो इंडेक्स करने की प्रोसेस पूरी नहीं हो पाती. इंडेक्स करने की प्रोसेस इन वजहों से पूरी नहीं हो पाती:
- इंडेक्स करने की सीमा पूरी हो गई है. उदाहरण के लिए, हो सकता है कि हर दस्तावेज़ के लिए इंडेक्स एंट्री की तय सीमा पूरी हो गई हो. अगर इंडेक्स नहीं बन पाता है, तो आपको गड़बड़ी का मैसेज दिखेगा. अगर इंडेक्स करने की सीमा पूरी नहीं हुई है, तो इंडेक्स करने की प्रोसेस को फिर से शुरू करें.
- मल्टीकी इंडेक्स ज़रूरी है. इंडेक्स किए गए कम से कम एक फ़ील्ड में, अरे वैल्यू मौजूद है. आगे बढ़ने के लिए, आपको मल्टीकी इंडेक्स का इस्तेमाल करना होगा या कलेक्शन की वैल्यू मिटानी होंगी.
- किसी कार्रवाई के तहत, अरे वैल्यू वाले कई फ़ील्ड को इंडेक्स करने की कोशिश की जाती है. मल्टीकी इंडेक्स में, अरे वैल्यू वाला एक से ज़्यादा फ़ील्ड नहीं हो सकता. आगे बढ़ने के लिए, अपने डेटा मॉडल या इंडेक्स की परिभाषाओं में बदलाव करें.
- आपने यूनीक इंडेक्स का विकल्प सेट किया है और इंडेक्स किए गए फ़ील्ड के डेटा से डुप्लीकेट इंडेक्स एंट्री बन जाएंगी. आगे बढ़ने के लिए, डेटा से वैल्यू के डुप्लीकेट कॉम्बिनेशन हटाएं.
आगे क्या करना है
- इंडेक्स या TTL इंडेक्स बनाने और मैनेज करने का तरीका जानें