Cloud Firestore में इंडेक्स टाइप

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

इस पेज में दो तरह के इंडेक्स के बारे में बताया गया है, जिनका इस्तेमाल Cloud Firestore होता है, सिंगल-फ़ील्ड इंडेक्स और कंपोज़िट इंडेक्स.

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

इंडेक्स, किसी दस्तावेज़ के फ़ील्ड की सूची के हिसाब से तय किया जाता है. साथ ही, हर फ़ील्ड के लिए इससे जुड़े इंडेक्स मोड का इस्तेमाल किया जाता है.

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

कंपोज़िट इंडेक्स को फ़ील्ड की वैल्यू के हिसाब से, इंडेक्स की परिभाषा में तय किए गए क्रम में लगाया जाता है.

हर क्वेरी के लिए इंडेक्स

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

इंडेक्स मैनेजमेंट की कम ज़रूरत, ऐप्लिकेशन डेवलपमेंट पर ज़्यादा सुविधाएं

Cloud Firestore में ऐसी सुविधाएं शामिल हैं जिनसे इंडेक्स मैनेज करने में लगने वाला समय कम हो जाता है. सबसे सामान्य क्वेरी के लिए ज़रूरी इंडेक्स, आपके लिए अपने-आप बनाए जाते हैं. अपने ऐप्लिकेशन का इस्तेमाल और उसकी जांच करने पर, Cloud Firestore आपके ऐप्लिकेशन के लिए ज़रूरी अतिरिक्त इंडेक्स बनाने और उन्हें पहचानने में मदद करता है.

इंडेक्स टाइप

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

सिंगल-फ़ील्ड इंडेक्स

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

अपने-आप इंडेक्स होने की सुविधा

डिफ़ॉल्ट रूप से, Cloud Firestore, दस्तावेज़ में हर फ़ील्ड और मैप में हर सबफ़ील्ड के लिए अपने-आप सिंगल-फ़ील्ड इंडेक्स बनाए रखता है. Cloud Firestore, सिंगल-फ़ील्ड इंडेक्स के लिए इन डिफ़ॉल्ट सेटिंग का इस्तेमाल करता है:

  • बिना कलेक्शन वाले और बिना मैप वाले हर फ़ील्ड के लिए, Cloud Firestore दो कलेक्शन-स्कोप वाले सिंगल फ़ील्ड इंडेक्स की जानकारी देता है, एक बढ़ते क्रम में और दूसरा घटते मोड में होता है.

  • हर मैप फ़ील्ड के लिए, Cloud Firestore ये बनाता है:

    • बिना कलेक्शन वाले, बिना मैप वाले हर सबफ़ील्ड के लिए, कलेक्शन के स्कोप वाला आरोही इंडेक्स.
    • बिना कलेक्शन वाले, बिना मैप वाले हर सबफ़ील्ड के लिए, कलेक्शन-स्कोप का एक घटते क्रम वाला इंडेक्स.
    • कलेक्शन के स्कोप वाले अरे में हर अरे सबफ़ील्ड के लिए इंडेक्स शामिल होता है.
    • Cloud Firestore, मैप के हर सबफ़ील्ड को बार-बार इंडेक्स करता है.
  • किसी दस्तावेज़ में हर अरे फ़ील्ड के लिए, Cloud Firestore, कलेक्शन-स्कोप अरे-में शामिल इंडेक्स बनाता है और उसे बनाए रखता है.

  • कलेक्शन ग्रुप स्कोप वाले सिंगल-फ़ील्ड इंडेक्स का रखरखाव डिफ़ॉल्ट रूप से नहीं किया जाता है.

सिंगल-फ़ील्ड इंडेक्स छूट

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

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

अगर किसी मैप फ़ील्ड के लिए सिंगल-फ़ील्ड इंडेक्स छूट बनाया जाता है, तो मैप के सबफ़ील्ड उन सेटिंग को इनहेरिट कर लेते हैं. हालांकि, खास सबफ़ील्ड के लिए सिंगल-फ़ील्ड इंडेक्स छूट तय की जा सकती है. अगर किसी सबफ़ील्ड के लिए कोई छूट मिटाई जाती है, तो सबफ़ील्ड अपनी पैरंट छूट सेटिंग, अगर मौजूद हो, तो उसे इनहेरिट करेगी. अगर पैरंट छूट मौजूद नहीं है, तो सबफ़ील्ड को डेटा बेस के हिसाब से ऐक्सेस की सेटिंग इनहेरिट करेंगे.

सिंगल-फ़ील्ड इंडेक्स छूट बनाने और मैनेज करने के लिए, Cloud Firestore में इंडेक्स मैनेज करना देखें.

कंपोज़िट इंडेक्स

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

Cloud Firestore, उन क्वेरी के लिए कंपोज़िट इंडेक्स का इस्तेमाल करता है जो पहले से सिंगल-फ़ील्ड इंडेक्स के साथ काम नहीं करती हैं.

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

जब भी कोई ऐसी क्वेरी करने की कोशिश की जाती है जो इंडेक्स के साथ काम नहीं करती है, तो Cloud Firestore एक लिंक के साथ गड़बड़ी का मैसेज दिखाता है. इस मैसेज का इस्तेमाल करके, इंडेक्स न किए गए इंडेक्स को बनाया जा सकता है.

कंसोल या Firebase सीएलआई का इस्तेमाल करके, मैन्युअल तौर पर भी कंपोज़िट इंडेक्स को तय और मैनेज किया जा सकता है. कंपोज़िट इंडेक्स बनाने और उन्हें मैनेज करने के बारे में ज़्यादा जानने के लिए, इंडेक्स मैनेज करना लेख पढ़ें.

इंडेक्स मोड और क्वेरी के दायरे

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

इंडेक्स मोड

इंडेक्स तय करते समय, इंडेक्स किए गए हर फ़ील्ड के लिए एक इंडेक्स मोड चुनना होता है. हर फ़ील्ड का इंडेक्स मोड, उस फ़ील्ड पर खास क्वेरी क्लॉज़ के साथ काम करता है. यहां दिए गए इंडेक्स मोड में से, किसी को भी चुना जा सकता है:

इंडेक्स मोड जानकारी
बढ़ते क्रम में फ़ील्ड पर <, <=, ==, >=, >, !=, in, और not-in जैसे क्वेरी क्लॉज़ काम करते हैं. साथ ही, इस फ़ील्ड वैल्यू के आधार पर बढ़ते क्रम में नतीजों को क्रम से लगाने की सुविधा देते हैं.
घटते क्रम में फ़ील्ड पर <, <=, ==, >=, >, !=, in, और not-in क्वेरी क्लॉज़ के साथ काम किया जा सकता है. साथ ही, इस फ़ील्ड की वैल्यू के आधार पर घटते क्रम में नतीजों को क्रम से लगाया जा सकता है.
कलेक्शन-इसमें शामिल है फ़ील्ड में array-contains और array-contains-any क्वेरी क्लॉज़ के साथ काम किया जा सकता है.
वेक्टर फ़ील्ड पर FindNearest क्वेरी क्लॉज़ के साथ काम करता है.

क्वेरी के स्कोप

हर इंडेक्स, किसी कलेक्शन या कलेक्शन ग्रुप तक सीमित होता है. इसे इंडेक्स क्वेरी का स्कोप कहा जाता है:

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

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

डिफ़ॉल्ट क्रम और __name__ फ़ील्ड

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

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

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
शहर नाम, __name__ डेटा इकट्ठा करना
शहर राज्य, __name__ डेटा इकट्ठा करना
शहर देश, जनसंख्या, __name__ डेटा इकट्ठा करना

नतीजों को नॉन-डिफ़ॉल्ट __name__ के हिसाब से क्रम में लगाने के लिए, आपको वह इंडेक्स बनाना होगा.

परफ़ेक्ट इंडेक्स

किसी क्वेरी के लिए सबसे सही इंडेक्स, क्वेरी को बेहतर तरीके से चलाने में मदद करता है. यह इंडेक्स, नीचे दी गई प्रॉपर्टी पर इस क्रम में तय किया जाता है:

  1. 'बराबर है' फ़िल्टर में इस्तेमाल किए गए फ़ील्ड
  2. क्रम से लगाने के लिए इस्तेमाल किए गए फ़ील्ड
  3. रेंज और इनक्वलिटी फ़िल्टर में इस्तेमाल किए गए फ़ील्ड, जो क्रम से लगाने के ऑर्डर में पहले से शामिल नहीं हैं
  4. एग्रीगेशन में इस्तेमाल किए गए फ़ील्ड (जो क्रम से लगाने के ऑर्डर, रेंज और इनक्वलिटी फ़िल्टर में पहले से शामिल नहीं हैं)

Firestore, क्वेरी के नतीजों का हिसाब इस तरह से लगाता है:

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

इंडेक्स करने का उदाहरण

आपके लिए अपने-आप सिंगल-फ़ील्ड इंडेक्स बनाकर, Cloud Firestore आपके ऐप्लिकेशन को सबसे बुनियादी डेटाबेस क्वेरी के साथ तुरंत काम करने की अनुमति देता है. सिंगल-फ़ील्ड इंडेक्स आपको फ़ील्ड वैल्यू और <, <=, ==, >=, >, और in प्रॉपर्टी के आधार पर आसान क्वेरी करने की सुविधा देते हैं. अरे फ़ील्ड के लिए, ये आपको array-contains और array-contains-any क्वेरी करने की अनुमति देते हैं.

यहां दिए गए उदाहरणों को इंडेक्स बनाने के नज़रिए से देखें. यह स्निपेट cities कलेक्शन में कुछ city दस्तावेज़ बनाता है और हर दस्तावेज़ के लिए name, state, country, capital, population, और tags फ़ील्ड सेट करता है:

वेब
var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

डिफ़ॉल्ट अपने-आप इंडेक्स होने की सेटिंग के हिसाब से, Cloud Firestore हर गैर-अरे फ़ील्ड के लिए बढ़ते क्रम में एक सिंगल-फ़ील्ड इंडेक्स अपडेट करता है, हर नॉन-अरे फ़ील्ड के लिए एक घटते क्रम वाला सिंगल-फ़ील्ड इंडेक्स अपडेट करता है, और अरे फ़ील्ड के लिए एक अरे वाले सिंगल-फ़ील्ड इंडेक्स को अपडेट करता है. नीचे दी गई टेबल की हर पंक्ति सिंगल फ़ील्ड इंडेक्स में किसी एंट्री को दिखाती है:

डेटा इकट्ठा करना फ़ील्ड को इंडेक्स किया गया क्वेरी का स्कोप
शहर नाम डेटा इकट्ठा करना
शहर राज्य डेटा इकट्ठा करना
शहर देश डेटा इकट्ठा करना
शहर कैपिटल डेटा इकट्ठा करना
शहर जनसंख्या डेटा इकट्ठा करना
शहर नाम डेटा इकट्ठा करना
शहर राज्य डेटा इकट्ठा करना
शहर देश डेटा इकट्ठा करना
शहर कैपिटल डेटा इकट्ठा करना
शहर जनसंख्या डेटा इकट्ठा करना
शहर array-contains इलाका डेटा इकट्ठा करना

सिंगल-फ़ील्ड इंडेक्स के साथ काम करने वाली क्वेरी

अपने-आप बने इन सिंगल-फ़ील्ड इंडेक्स का इस्तेमाल करके, आसान क्वेरी चलाई जा सकती हैं. जैसे:

वेब
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

in और मिश्रित समानता (==) क्वेरी भी बनाई जा सकती हैं:

वेब
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

अगर आपको ऐसी कंपाउंड क्वेरी चलानी है जिसमें रेंज की तुलना (<, <=, > या >=) का इस्तेमाल किया गया हो या आपको किसी दूसरे फ़ील्ड के हिसाब से क्रम में लगाना हो, तो आपको उस क्वेरी के लिए कंपोज़िट इंडेक्स बनाना होगा.

array-contains इंडेक्स की मदद से, regions कलेक्शन वाले फ़ील्ड से क्वेरी की जा सकती है:

वेब
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

कंपोज़िट इंडेक्स के साथ काम करने वाली क्वेरी

Cloud Firestore, कंपोज़िट इंडेक्स का इस्तेमाल करके ऐसी कंपोज़िट क्वेरी के लिए काम करता है जो पहले से सिंगल-फ़ील्ड इंडेक्स के साथ काम नहीं करती हैं. उदाहरण के लिए, आपको इन क्वेरी के लिए एक कंपोज़िट इंडेक्स की ज़रूरत होगी:

वेब
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

इन क्वेरी के लिए नीचे दिए गए कंपोज़िट इंडेक्स की ज़रूरत होती है. country फ़ील्ड के लिए क्वेरी में बराबरी (== या in) का इस्तेमाल किया गया है. इसलिए, इस फ़ील्ड के लिए बढ़ते या घटते क्रम में इंडेक्स मोड का इस्तेमाल किया जा सकता है. डिफ़ॉल्ट रूप से, इनक्वलिटी क्लॉज़, इनक्वलिटी क्लॉज़ में मौजूद फ़ील्ड के आधार पर बढ़ते क्रम में लागू होते हैं.

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
शहर (या ) देश, जनसंख्या डेटा इकट्ठा करना

मिलती-जुलती क्वेरी को घटते क्रम में लगाने के लिए, आपको population के लिए घटते क्रम में एक और कंपोज़िट इंडेक्स की ज़रूरत होगी:

वेब
citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
शहर देश, जनसंख्या डेटा इकट्ठा करना
शहर देश, जनसंख्या डेटा इकट्ठा करना

आपको अतिरिक्त क्लॉज़ के साथ array-contains या array-contains-any क्वेरी को जोड़ने के लिए, एक कंपोज़िट इंडेक्स बनाना होगा.

वेब
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
शहर array-contains टैग, (या ) कैपिटल डेटा इकट्ठा करना

कलेक्शन ग्रुप के इंडेक्स के साथ काम करने वाली क्वेरी

कलेक्शन ग्रुप के स्कोप वाले इंडेक्स को दिखाने के लिए, मान लें कि आपने city के कुछ दस्तावेज़ों में landmarks सब-कलेक्शन जोड़ा है:

वेब
var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

कलेक्शन के स्कोप के साथ यहां दिए गए सिंगल-फ़ील्ड इंडेक्स का इस्तेमाल करके, category फ़ील्ड के आधार पर किसी एक शहर के landmarks कलेक्शन के लिए क्वेरी की जा सकती है:

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
लैंडमार्क (या ) कैटगरी डेटा इकट्ठा करना
वेब
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

अब मान लें कि आपकी दिलचस्पी सभी शहरों के लैंडमार्क के बारे में क्वेरी करने में है. इस क्वेरी को landmarks कलेक्शन वाले कलेक्शन ग्रुप में चलाने के लिए, आपको कलेक्शन ग्रुप के स्कोप के साथ landmarks सिंगल-फ़ील्ड इंडेक्स चालू करना होगा:

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
लैंडमार्क (या ) कैटगरी कलेक्शन ग्रुप

इस इंडेक्स को चालू करने पर, landmarks कलेक्शन ग्रुप से क्वेरी की जा सकती है:

वेब
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

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

उदाहरण के लिए, अतिरिक्त इंडेक्स चालू किए बिना, नीचे दी गई कलेक्शन ग्रुप क्वेरी को चलाया जा सकता है:

वेब
db.collectionGroup("landmarks").get()

इंडेक्स एंट्री

आपके प्रोजेक्ट के कॉन्फ़िगर किए गए इंडेक्स और दस्तावेज़ का स्ट्रक्चर, किसी दस्तावेज़ के लिए इंडेक्स एंट्री की संख्या तय करता है. इंडेक्स एंट्री को इंडेक्स एंट्री की संख्या की सीमा में गिना जाता है.

इस उदाहरण में, दस्तावेज़ के इंडेक्स होने की जानकारी दी गई है.

दस्तावेज़

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

सिंगल-फ़ील्ड इंडेक्स

  • City_name एएससी
  • शहर का नाम DESC
  • तापमान.गर्मी एएससी
  • तापमान.गर्मी का DESC
  • तापमान.सर्दियों में एएससी
  • तापमान.सर्दियों के बारे में जानकारी
  • आस-पड़ोस में मौजूद अरे में शामिल है (ASC और DESC)

कंपोज़िट इंडेक्स

  • City_name ASC, आस-पड़ोस के ARRAY
  • City_name DESC, आस-पड़ोस के ARRAY

इंडेक्स एंट्री

इंडेक्स करने के इस कॉन्फ़िगरेशन की वजह से, दस्तावेज़ के लिए ये 18 इंडेक्स एंट्री दिखती हैं:

इंडेक्स इंडेक्स किया गया डेटा
सिंगल-फ़ील्ड इंडेक्स एंट्री
City_name एएससी City_name: "सैन फ़्रांसिस्को"
शहर का नाम DESC City_name: "सैन फ़्रांसिस्को"
तापमान.गर्मी एएससी तापमान.गर्मी: 67
तापमान.गर्मी का DESC तापमान.गर्मी: 67
तापमान.सर्दियों में एएससी सर्दी के मौसम के हिसाब से तापमान: 55
तापमान.सर्दियों के बारे में जानकारी सर्दी के मौसम के हिसाब से तापमान: 55
आस-पड़ोस श्रेणी में ASC शामिल है आस-पड़ोस: "मिशन"
आस-पड़ोस की श्रेणी में DESC शामिल है आस-पड़ोस: "मिशन"
आस-पड़ोस श्रेणी में ASC शामिल है आस-पड़ोस: "डाउनटाउन"
आस-पड़ोस की श्रेणी में DESC शामिल है आस-पड़ोस: "डाउनटाउन"
आस-पड़ोस श्रेणी में ASC शामिल है आस-पड़ोस: "मरीना"
आस-पड़ोस की श्रेणी में DESC शामिल है आस-पड़ोस: "मरीना"
कंपोज़िट इंडेक्स एंट्री
City_name ASC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "मिशन"
City_name ASC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "डाउनटाउन"
City_name ASC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "मरीना"
City_name DESC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "मिशन"
City_name DESC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "डाउनटाउन"
City_name DESC, आस-पड़ोस के ARRAY City_name: "सैन फ़्रांसिस्को", आस-पड़ोस: "मरीना"

इंडेक्स और कीमत

इंडेक्स से, आपके ऐप्लिकेशन के स्टोरेज के खर्च का पता चलता है. इंडेक्स के लिए स्टोरेज साइज़ का हिसाब लगाने के तरीके के बारे में ज़्यादा जानने के लिए, इंडेक्स एंट्री साइज़ देखें.

इंडेक्स मर्जिंग का फ़ायदा लेना

हालांकि, Cloud Firestore हर क्वेरी के लिए इंडेक्स का इस्तेमाल करता है, लेकिन इसके लिए हर क्वेरी के लिए एक इंडेक्स की ज़रूरत नहीं होती. एक से ज़्यादा इक्वलिटी (==) क्लॉज़ वाली क्वेरी और वैकल्पिक रूप से, orderBy क्लॉज़ वाली क्वेरी के लिए Cloud Firestore मौजूदा इंडेक्स का फिर से इस्तेमाल कर सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है. Cloud Firestore, समानता वाले फ़िल्टर के लिए इंडेक्स को मर्ज कर सकता है, ताकि समानता वाली क्वेरी के लिए ज़रूरी कंपोज़िट इंडेक्स बनाए जा सकें.

इंडेक्स करने की लागत को कम करने के लिए, उन स्थितियों की पहचान करें जहां आपको इंडेक्स मर्ज करने का फ़ायदा मिल सकता है. उदाहरण के लिए, किसी रेस्टोरेंट के रेटिंग ऐप्लिकेशन के लिए restaurants कलेक्शन की कल्पना करें:

  • रेस्टोरेंट

    • बर्गर

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

अब, मान लें कि यह ऐप्लिकेशन, नीचे दी गई क्वेरी का इस्तेमाल करता है. ध्यान दें कि ऐप्लिकेशन category, city, और editors_pick के लिए 'बराबर है' क्लॉज़ के कॉम्बिनेशन का इस्तेमाल करता है. साथ ही, इन्हें बढ़ते क्रम में star_rating के हिसाब से क्रम में लगाया जाता है:

वेब
db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

हर क्वेरी के लिए इंडेक्स बनाया जा सकता है:

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
रेस्टोरेंट कैटगरी, स्टार_रेटिंग डेटा इकट्ठा करना
रेस्टोरेंट शहर, स्टार_रेटिंग डेटा इकट्ठा करना
रेस्टोरेंट कैटगरी, शहर, स्टार_रेटिंग डेटा इकट्ठा करना
रेस्टोरेंट कैटगरी, शहर, एडिटर_पिक, स्टार_रेटिंग डेटा इकट्ठा करना

एक बेहतर समाधान के तौर पर, आप eक्वालिटी क्लॉज़ के लिए इंडेक्स मर्ज करने की Cloud Firestore की सुविधा का फ़ायदा उठाकर इंडेक्स की संख्या कम कर सकते हैं:

डेटा इकट्ठा करना इंडेक्स किए गए फ़ील्ड क्वेरी का स्कोप
रेस्टोरेंट कैटगरी, स्टार_रेटिंग डेटा इकट्ठा करना
रेस्टोरेंट शहर, स्टार_रेटिंग डेटा इकट्ठा करना
रेस्टोरेंट एडिटर_पिक, स्टार_रेटिंग डेटा इकट्ठा करना

इस इंडेक्स का यह सेट न सिर्फ़ छोटा है, बल्कि दूसरी क्वेरी के साथ भी काम करता है:

वेब
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

इंडेक्स करने की सीमाएं

इंडेक्स पर ये सीमाएं लागू होती हैं. सभी कोटा और सीमाएं देखने के लिए, कोटा और सीमाएं देखें.

सीमा जानकारी
किसी डेटाबेस के लिए कंपोज़िट इंडेक्स की ज़्यादा से ज़्यादा संख्या
किसी डेटाबेस के लिए, सिंगल-फ़ील्ड कॉन्फ़िगरेशन की ज़्यादा से ज़्यादा संख्या

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

हर दस्तावेज़ के लिए इंडेक्स एंट्री की ज़्यादा से ज़्यादा संख्या

40,000

किसी दस्तावेज़ के लिए इंडेक्स एंट्री की संख्या, इनका कुल योग होती है:

  • सिंगल-फ़ील्ड इंडेक्स एंट्री की संख्या
  • संयुक्त इंडेक्स एंट्री की संख्या

यह देखने के लिए कि Cloud Firestore किसी दस्तावेज़ और इंडेक्स के सेट को इंडेक्स एंट्री में कैसे बदलता है, इंडेक्स में एंट्री की संख्या का यह उदाहरण देखें.

किसी कंपोज़िट इंडेक्स में फ़ील्ड की ज़्यादा से ज़्यादा संख्या 100
इंडेक्स एंट्री का ज़्यादा से ज़्यादा साइज़

7.5 केआईबी

Cloud Firestore, इंडेक्स एंट्री साइज़ का हिसाब कैसे लगाता है, यह जानने के लिए इंडेक्स एंट्री साइज़ देखें.

किसी दस्तावेज़ की इंडेक्स एंट्री के साइज़ का ज़्यादा से ज़्यादा योग

8 एमआईबी

किसी दस्तावेज़ का कुल साइज़, इन चीज़ों का कुल साइज़ होता है:

  • किसी दस्तावेज़ के सिंगल-फ़ील्ड इंडेक्स एंट्री के साइज़ का योग
  • किसी दस्तावेज़ के कंपोज़िट इंडेक्स एंट्री के साइज़ का योग
  • इंडेक्स किए गए फ़ील्ड की वैल्यू का ज़्यादा से ज़्यादा साइज़

    1500 बाइट

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

    इंडेक्स करने के सबसे सही तरीके

    ज़्यादातर ऐप्लिकेशन के लिए, अपने इंडेक्स को मैनेज करने के लिए अपने-आप इंडेक्स होने की सुविधा और गड़बड़ी के मैसेज वाले लिंक का इस्तेमाल किया जा सकता है. हालांकि, नीचे दिए गए मामलों में, सिंगल-फ़ील्ड छूट जोड़ी जा सकती है:

    कारक जानकारी
    बड़े स्ट्रिंग फ़ील्ड

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

    क्रम से वैल्यू वाले दस्तावेज़ों वाले कलेक्शन के लिए, लिखने की ज़्यादा दर

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

    उदाहरण के लिए, ज़्यादा राइट रेट वाले IoT इस्तेमाल के उदाहरण में, टाइमस्टैंप फ़ील्ड वाले दस्तावेज़ों वाले कलेक्शन में 500 राइट प्रति सेकंड की सीमा तक पहुंच सकते हैं.

    TTL फ़ील्ड

    अगर टीटीएल (टीटीएल) (टाइम-टू-लाइव) नीतियों का इस्तेमाल किया जाता है, तो ध्यान दें कि टीटीएल फ़ील्ड में टाइमस्टैंप होना चाहिए. TTL फ़ील्ड पर इंडेक्स करने की सुविधा डिफ़ॉल्ट रूप से चालू होती है. इससे ज़्यादा ट्रैफ़िक दर मिलने पर पेज की परफ़ॉर्मेंस पर असर पड़ सकता है. सबसे सही तरीका यह है कि अपने TTL फ़ील्ड के लिए एक फ़ील्ड वाली छूट जोड़ें.

    बड़ा अरे या मैप फ़ील्ड

    बड़े अरे या मैप फ़ील्ड में, हर दस्तावेज़ के लिए 40,000 इंडेक्स एंट्री की सीमा पूरी हो सकती है. अगर बड़े अरे या मैप फ़ील्ड के आधार पर क्वेरी नहीं की जा रही है, तो आपको इसे इंडेक्स किए जाने से छूट देनी चाहिए.

    अगर एक से ज़्यादा फ़ील्ड में रेंज और इनक्वलिटी ऑपरेटर वाली क्वेरी का इस्तेमाल किया जा रहा है, तो इंडेक्स करने से जुड़ी वे बातें देखें जिन पर आपको Cloud Firestore क्वेरी की परफ़ॉर्मेंस और लागत को ऑप्टिमाइज़ करने के लिए ध्यान में रखना चाहिए

    इंडेक्स करने से जुड़ी समस्याओं (इंडेक्स फ़ैनआउट, INVALID_ARGUMENT गड़बड़ियां) को ठीक करने के तरीके के बारे में ज़्यादा जानने के लिए, समस्या हल करने वाला पेज देखें.