नेटिव मोड में Firestore में, दो तरह के ऑपरेशन होते हैं - Firestore के मुख्य ऑपरेशन और Firestore के पाइपलाइन ऑपरेशन.
Firestore के मुख्य ऑपरेशन, दस्तावेज़ बनाने, पढ़ने, अपडेट करने, और मिटाने (सीआरयूडी) की स्टैंडर्ड सुविधा देते हैं. इसके अलावा, इनमें रीयल-टाइम में क्वेरी सुनने और ऑफ़लाइन मोड में डेटा सेव करने की सुविधा भी होती है. इस वर्शन में, एक अहम अंतर यह है कि इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, सिंगल फ़ील्ड के लिए इंडेक्स अपने-आप नहीं बनते. इससे, इंडेक्स को पहले से कॉन्फ़िगर किए बिना क्वेरी को चलाया जा सकता है. हालांकि, इंडेक्स न की गई क्वेरी, डिफ़ॉल्ट रूप से पूरे कलेक्शन को स्कैन करेंगी. डेटासेट बढ़ने पर, इससे इंतज़ार का समय और लागत बढ़ सकती है.
Firestore के पाइपलाइन ऑपरेशन, Firestore Enterprise वर्शन की एक मुख्य सुविधा है. इसे क्वेरी इंजन के ऐडवांस वर्शन पर बनाया गया है, ताकि क्वेरी की रेंज को बढ़ाया जा सके. पाइपलाइन ऑपरेशन में, क्वेरी के लिए फ़्लेक्सिबल सिंटैक्स और इंडेक्सिंग का अलग तरीका इस्तेमाल किया जाता है. इसमें इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, इंडेक्स अपने-आप नहीं बनते. इससे, ऐप्लिकेशन के लिए डेटा वापस पाने के ऐडवांस ऑपरेशन किए जा सकते हैं.
Firestore के मुख्य ऑपरेशन की सुविधाएं
मुख्य ऑपरेशन की मदद से, सीआरयूडी के स्टैंडर्ड ऑपरेशन और रीयल-टाइम में क्वेरी सुनने की सुविधा मिलती है. हालांकि, Enterprise वर्शन पर इन ऑपरेशन का इस्तेमाल करने पर, इंडेक्सिंग और बिलिंग से जुड़े व्यवहार में, स्टैंडर्ड वर्शन की तुलना में काफ़ी बदलाव होता है.
सुविधा और डेटा की उपलब्धता
मुख्य ऑपरेशन में, स्टैंडर्ड वर्शन में इस्तेमाल किया जाने वाला फ़ैमिलियर मेथड-चेनिंग सिंटैक्स (उदाहरण के लिए, .where(), .orderBy()) बरकरार रहता है. इन ऑपरेशन में, मोबाइल और वेब क्लाइंट के लिए रीयल-टाइम में क्वेरी सुनने और ऑफ़लाइन मोड में डेटा सेव करने की सुविधा मिलती है. हमारा सुझाव है कि इन ऑपरेशन का इस्तेमाल, स्टैंडर्ड ट्रांज़ैक्शनल वर्कलोड, सामान्य लुकअप, और मौजूदा ऐप्लिकेशन कोड माइग्रेशन के लिए किया जाए.
कस्टम इंडेक्सिंग
Enterprise वर्शन में, मुख्य ऑपरेशन के तहत सिंगल-फ़ील्ड इंडेक्स अपने-आप नहीं बनते. जबकि, स्टैंडर्ड वर्शन में ऐसा होता है. इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, क्वेरी चलाने के लिए इंडेक्स की ज़रूरत नहीं होती. अगर कोई खास इंडेक्स मौजूद नहीं है, तो क्वेरी पूरे कलेक्शन को स्कैन करती है. इंडेक्स न की गई क्वेरी से, रैपिड प्रोटोटाइपिंग की जा सकती है. हालांकि, डेटासेट बढ़ने पर, इनकी परफ़ॉर्मेंस धीमी हो सकती है और लागत बढ़ सकती है. डेवलपर को क्वेरी की परफ़ॉर्मेंस ऑप्टिमाइज़ करने और रीड यूनिट की खपत कम करने के लिए, मैन्युअल तरीके से इंडेक्स बनाने होंगे.
बिलिंग मॉडल (यूनिट के हिसाब से)
रीड यूनिट का शुल्क, हर दस्तावेज़ की संख्या के हिसाब से नहीं, बल्कि 4 केबी के हिसाब से लिया जाता है. इंडेक्स न की गई क्वेरी, बड़े कलेक्शन को स्कैन करने पर, सभी दस्तावेज़ों में स्कैन किए गए कुल बाइट के हिसाब से रीड यूनिट की खपत करेगी. राइट यूनिट का शुल्क, 1 केबी के हिसाब से लिया जाता है. किसी दस्तावेज़ को लिखने पर, डेटा के लिए यूनिट की खपत होती है. इसके अलावा, अपडेट की गई हर इंडेक्स एंट्री के लिए अतिरिक्त यूनिट की खपत होती है. स्टैंडर्ड वर्शन में, सिंगल-फ़ील्ड इंडेक्सिंग अपने-आप होती है. हालांकि, अब Enterprise वर्शन में, लिखने की लागत और परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, इंडेक्स करने के लिए खास फ़ील्ड चुने जा सकते हैं.
Firestore के पाइपलाइन ऑपरेशन की सुविधाएं
Firestore Enterprise वर्शन में, पाइपलाइन ऑपरेशन के साथ क्वेरी इंजन के ऐडवांस वर्शन का इस्तेमाल किया जाता है. इससे, Firestore के स्टैंडर्ड वर्शन की कई मौजूदा सीमाएं खत्म हो जाती हैं. पाइपलाइन ऑपरेशन में, क्वेरी की सैकड़ों अतिरिक्त सुविधाएं मिलती हैं. पाइपलाइन ऑपरेशन में ये सुविधाएं मिलती हैं:
स्टेज-आधारित कंपोज़ेबल सिंटैक्स
पाइपलाइन क्वेरी, क्रम से चलने वाले स्टेज की सीरीज़ तय करके बनाई जाती हैं. ये स्टेज क्रम से चलते हैं. इससे, जटिल ऑपरेशन किए जा सकते हैं. जैसे, एग्रीगेशन के नतीजे पर फ़िल्टर करना. पहले यह सुविधा उपलब्ध नहीं थी.
यहां पाइपलाइन क्वेरी का एक उदाहरण दिया गया है. इससे, पिछले महीने में देखे गए यूनीक प्रॉडक्ट आईडी की संख्या का पता चलता है:
guard let cutoffDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else {
return
}
let snapshot = try await db.pipeline()
.collection("productViews")
.where(Field("viewedAt").greaterThan(cutoffDate.timeIntervalSince1970))
.aggregate([Field("productId").countDistinct().as("uniqueProductViews")])
.execute()
बढ़ी हुई सुविधाएं
पाइपलाइन क्वेरी में, कई नई सुविधाएं मिलती हैं. इनमें ये शामिल हैं:
- एग्रीगेशन: आर्बिट्ररी ग्रुपिंग फ़ील्ड के साथ, एग्रीगेशन के नए फ़ंक्शन (जैसे,
sum(...),min(...), औरcount_distinct(...)) के लिए सहायता. - रिलेशनल जॉइन: कोरिलेटेड सबक्वेरी का इस्तेमाल करके, कलेक्शन और सबकलेक्शन में सर्वर-साइड जॉइन करना.
- जटिल फ़िल्टरिंग:
regex_match(...),add(...)औरstr_contains(...)जैसी सैकड़ों अतिरिक्त फ़ंक्शन के लिए सहायता. इससे,where(...)स्टेटमेंट को आर्बिट्ररी तरीके से जटिल बनाया जा सकता है. इसके लिए, इंडेक्स की ज़रूरत नहीं होती. - आंशिक तौर पर पढ़ना / प्रोजेक्शन:
select(...),remove_fields(...), और दस्तावेज़ में बदलाव करने वाले कई अन्य स्टेज का इस्तेमाल करके, दस्तावेज़ों के डाइनैमिक सबसेट वापस पाना.
इन सुविधाओं के बारे में ज़्यादा जानने के लिए, पाइपलाइन ऑपरेशन की मदद से डेटा के लिए क्वेरी करना लेख पढ़ें.
रीयल-टाइम और ऑफ़लाइन सहायता
रीयल-टाइम और ऑफ़लाइन सहायता का इस्तेमाल करने के लिए, डेवलपर Firestore Enterprise वर्शन में Firestore के मुख्य ऑपरेशन का इस्तेमाल कर सकते हैं.
क्लाइंट और टूलिंग इंटिग्रेशन
Enterprise वर्शन में, पाइपलाइन क्वेरी के साथ इंटरैक्ट करने और उन्हें मैनेज करने के लिए, खास सुविधाएं शामिल हैं:
- क्वेरी की जानकारी और प्रोफ़ाइलिंग: क्वेरी की जानकारी के नतीजों का इस्तेमाल करके, यह समझा जा सकता है कि कोई क्वेरी, रीड या राइट यूनिट की कितनी खपत करती है. साथ ही, इसके एक्ज़ीक्यूशन का विश्लेषण किया जा सकता है.
- क्वेरी की अहम जानकारी: Enterprise वर्शन में, क्वेरी की अहम जानकारी की सुविधा मिलती है. इससे यह तय करने में मदद मिलती है कि परफ़ॉर्मेंस और लागत को बेहतर बनाने के लिए, इंडेक्स कहां बनाए जा सकते हैं. इसके लिए, डेटाबेस पर चलने वाली सबसे ज़्यादा क्वेरी और उनकी परफ़ॉर्मेंस की जानकारी मिलती है
- इंडेक्स के नए टाइप: Enterprise वर्शन के लिए, खास इंडेक्स बनाए जा सकते हैं. इनमें स्पार्स, नॉन-स्पार्स, और यूनीक इंडेक्स जैसे इंडेक्स टाइप शामिल हैं. इसमें, Enterprise डेटाबेस के लिए वेक्टर सर्च इंडेक्स बनाने और उनमें बदलाव करने की सुविधा भी मिलती है.
Firestore के स्टैंडर्ड वर्शन और Firestore के Enterprise वर्शन के बीच अंतर
मुख्य ऑपरेशन और पाइपलाइन ऑपरेशन के बीच, ऑपरेशन से जुड़ा मुख्य अंतर इंडेक्सिंग को मैनेज करने में है. इससे, परफ़ॉर्मेंस और लागत पर सीधे असर पड़ता है.
| स्टैंडर्ड वर्शन - मुख्य ऑपरेशन | Enterprise वर्शन - मुख्य ऑपरेशन और पाइपलाइन ऑपरेशन | |
| इंडेक्सिंग की ज़रूरी शर्त | क्वेरी के लिए इंडेक्स ज़रूरी हैं.
सिंगल फ़ील्ड के लिए इंडेक्स अपने-आप बन जाते हैं. वहीं, ज़्यादा जटिल क्वेरी के लिए, कंपोज़िट इंडेक्स या कलेक्शन ग्रुप इंडेक्स पर निर्भर रहना पड़ता है. इन्हें मैन्युअल तरीके से कॉन्फ़िगर करना होता है. |
इंडेक्स ज़रूरी नहीं हैं. इसलिए, क्वेरी के लिए इंडेक्स बनाना ज़रूरी नहीं है.
ज़रूरत के हिसाब से इंडेक्स तय किए जा सकते हैं. Enterprise वर्शन में, इंडेक्स के कई टाइप इस्तेमाल किए जा सकते हैं. इनमें नॉन-स्पार्स/स्पार्स और यूनीक इंडेक्स शामिल हैं. |
| इंडेक्स किए गए फ़ील्ड | अगर इंडेक्स किए गए फ़ील्ड में __name__ फ़ील्ड पहले से मौजूद नहीं है, तो यह अपने-आप जुड़ जाता है. | __name__ इंडेक्स किए गए फ़ील्ड में अपने-आप नहीं जुड़ता. अगर आपके ऐप्लिकेशन के लिए __name__ फ़ील्ड ज़रूरी है, तो आपको इंडेक्स किए गए फ़ील्ड में इसे साफ़ तौर पर तय करना होगा. |
| सॉर्ट ऑर्डर नॉर्मलाइज़ेशन | क्वेरी के 'ऑर्डर बाय' क्लॉज़ को नॉर्मलाइज़ किया जाता है. इसके लिए, असमानता वाले फ़ील्ड और __name__ फ़ील्ड को आखिर में जोड़ा जाता है. ऐसा तब किया जाता है, जब ये फ़ील्ड पहले से मौजूद न हों. इससे, नतीजों का क्रम यूनीक और तय होता है. भले ही, 'ऑर्डर बाय' क्लॉज़ में कोई अन्य फ़ील्ड मौजूद हो. | सॉर्ट ऑर्डर नॉर्मलाइज़ेशन नहीं होता. सॉर्ट ए एएससी जैसे सॉर्ट ऑर्डर से सिर्फ़ यह पक्का होता है कि नतीजों को फ़ील्ड a के हिसाब से सॉर्ट किया गया है. Cloud Firestore, नतीजों को सबसे बेहतर क्रम में दिखाने के लिए, आपके मौजूदा इंडेक्स का इस्तेमाल करेगा. इसलिए, अगर नतीजों के सेट में a यूनीक नहीं है, तो इंडेक्स कॉन्फ़िगरेशन, एक्ज़ीक्यूशन की रणनीतियों वगैरह के आधार पर, क्वेरी के हिसाब से नतीजों का क्रम अलग-अलग हो सकता है. नतीजों का क्रम यूनीक और तय करने के लिए, आपको सॉर्ट ऑर्डर में कोई यूनीक फ़ील्ड जोड़ना होगा. जैसे, __name__. |
| परफ़ॉर्मेंस | इंडेक्स की गई क्वेरी: परफ़ॉर्मेंस और लागत, नतीजों के सेट के साइज़ के हिसाब से बढ़ती है. |
इंडेक्स न की गई क्वेरी: परफ़ॉर्मेंस और लागत, डेटासेट के साइज़ के हिसाब से बढ़ती है. इंडेक्स की गई क्वेरी: परफ़ॉर्मेंस और लागत, नतीजों के सेट के साइज़ के हिसाब से बढ़ती है. हमारा सुझाव है कि इंडेक्स बनाने और क्वेरी की परफ़ॉर्मेंस और लागत को बेहतर बनाने के लिए, क्वेरी की जानकारी और क्वेरी की अहम जानकारी टूल का इस्तेमाल करें. |
| स्टोरेज की लागत पर असर | ऑटोमैटिक इंडेक्स और कंपोज़िट इंडेक्स की वजह से, स्टोरेज का ओवरहेड बढ़ता है. | स्टोरेज की लागत कम होती है, क्योंकि हर फ़ील्ड के लिए इंडेक्स अपने-आप नहीं बनते. |
| लागत का आधार | हर दस्तावेज़ को पढ़ने, लिखने, और मिटाने के ऑपरेशन के लिए शुल्क लिया जाता है. | रीड यूनिट (4 केबी के हिसाब से) और राइट यूनिट (1 केबी के हिसाब से) के हिसाब से शुल्क लिया जाता है. इंडेक्स एंट्री लिखने पर, राइट यूनिट की खपत होती है.
कीमतों में हुए बदलाव के बारे में कुछ उदाहरणों के साथ जानें. |
| सुरक्षा के नियम | सुरक्षा के नियम, पढ़ने/लिखने की अनुमतियों की पुष्टि करके, कलेक्शन को सुरक्षित रखते हैं. | सुरक्षा के नियम, पढ़ने/लिखने की अनुमतियों की पुष्टि करके, कलेक्शन को सुरक्षित रखते हैं. डेटा मॉडल गाइड में, पाइपलाइन क्वेरी के लिए डेटा को मॉडल करने का तरीका जानें. |