नेटिव मोड में Firestore में, दो तरह के ऑपरेशन होते हैं - Firestore के मुख्य ऑपरेशन और Firestore के पाइपलाइन ऑपरेशन.
Firestore के मुख्य ऑपरेशन, दस्तावेज़ बनाने, पढ़ने, अपडेट करने, और मिटाने (CRUD) की स्टैंडर्ड सुविधा देते हैं. इसके अलावा, इनमें रीयल-टाइम में क्वेरी सुनने और ऑफ़लाइन मोड में डेटा सेव करने की सुविधा भी होती है. इस वर्शन में, ऑपरेशन से जुड़ा एक अहम अंतर यह है कि इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, सिंगल फ़ील्ड के लिए इंडेक्स अपने-आप नहीं बनते. इससे, इंडेक्स को पहले से कॉन्फ़िगर किए बिना क्वेरी को चलाया जा सकता है. हालांकि, इंडेक्स के बिना क्वेरी करने पर, पूरा कलेक्शन स्कैन किया जाएगा. डेटासेट बढ़ने पर, इससे लेटेन्सी और लागत बढ़ सकती है.
Firestore के पाइपलाइन ऑपरेशन, Firestore Enterprise वर्शन की एक मुख्य सुविधा है. यह एक ऐडवांस क्वेरी इंजन पर बनी है, ताकि क्वेरी की रेंज को बढ़ाया जा सके. पाइपलाइन ऑपरेशन में, क्वेरी का फ़्लेक्सिबल सिंटैक्स और इंडेक्सिंग का एक अलग तरीका इस्तेमाल किया जाता है. इसमें इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, इंडेक्स अपने-आप नहीं बनते. इससे, ऐप्लिकेशन के लिए डेटा वापस पाने के ऐडवांस ऑपरेशन किए जा सकते हैं.
Firestore के मुख्य ऑपरेशन की सुविधाएं
मुख्य ऑपरेशन की मदद से, CRUD के स्टैंडर्ड ऑपरेशन और रीयल-टाइम में क्वेरी सुनने की सुविधा मिलती है. हालांकि, Enterprise वर्शन पर इन ऑपरेशन का इस्तेमाल करने पर, इंडेक्सिंग और बिलिंग से जुड़े बुनियादी व्यवहार में, स्टैंडर्ड वर्शन की तुलना में काफ़ी बदलाव होता है.
फ़ंक्शन और जारी रखने की सुविधा
मुख्य ऑपरेशन में, स्टैंडर्ड वर्शन में इस्तेमाल किया जाने वाला फ़ैमिलियर मेथड-चेनिंग सिंटैक्स (उदाहरण के लिए, .where(), .orderBy()) बरकरार रहता है. ये ऑपरेशन, मोबाइल और वेब क्लाइंट के लिए रीयल-टाइम में क्वेरी सुनने और ऑफ़लाइन मोड में डेटा सेव करने की सुविधा देते हैं. हमारा सुझाव है कि इन ऑपरेशन का इस्तेमाल, स्टैंडर्ड ट्रांज़ैक्शनल वर्कलोड, सामान्य लुकअप, और मौजूदा ऐप्लिकेशन कोड माइग्रेशन के लिए किया जाए.
कस्टम इंडेक्सिंग
Enterprise वर्शन में, मुख्य ऑपरेशन के तहत सिंगल-फ़ील्ड इंडेक्स अपने-आप नहीं बनते. जबकि, स्टैंडर्ड वर्शन में ऐसा होता है. इंडेक्स बनाना ज़रूरी नहीं है. साथ ही, क्वेरी चलाने के लिए इंडेक्स की ज़रूरत नहीं होती. अगर कोई खास इंडेक्स मौजूद नहीं है, तो क्वेरी में पूरा कलेक्शन स्कैन किया जाता है. इंडेक्स के बिना क्वेरी करने से, रैपिड प्रोटोटाइपिंग की जा सकती है. हालांकि, डेटासेट बढ़ने पर, इनकी परफ़ॉर्मेंस धीमी हो सकती है और लागत बढ़ सकती है. डेवलपर को क्वेरी की परफ़ॉर्मेंस ऑप्टिमाइज़ करने और रीड यूनिट के इस्तेमाल को कम करने के लिए, मैन्युअल तरीके से इंडेक्स बनाने होंगे.
बिलिंग मॉडल (यूनिट के हिसाब से)
रीड यूनिट का शुल्क, हर दस्तावेज़ की संख्या के हिसाब से नहीं, बल्कि 4 केबी के हिसाब से लिया जाता है. इंडेक्स के बिना क्वेरी करने पर, बड़े कलेक्शन को स्कैन करने के लिए, सभी दस्तावेज़ों में स्कैन किए गए कुल बाइट के हिसाब से रीड यूनिट का शुल्क लिया जाएगा. राइट यूनिट का शुल्क, 1 केबी के हिसाब से लिया जाता है. किसी दस्तावेज़ को लिखने पर, डेटा के लिए यूनिट का शुल्क लिया जाता है. इसके अलावा, अपडेट की गई हर इंडेक्स एंट्री के लिए अतिरिक्त यूनिट का शुल्क लिया जाता है. स्टैंडर्ड वर्शन में, सिंगल-फ़ील्ड इंडेक्सिंग अपने-आप होती है. हालांकि, अब Enterprise वर्शन में, राइट की लागत और परफ़ॉर्मेंस ऑप्टिमाइज़ करने के लिए, इंडेक्स करने के लिए खास फ़ील्ड चुने जा सकते हैं.
Firestore के पाइपलाइन ऑपरेशन की सुविधाएं
पाइपलाइन ऑपरेशन के साथ Firestore Enterprise वर्शन, एक ऐडवांस क्वेरी इंजन का इस्तेमाल करता है. इससे, Firestore Standard वर्शन की कई मौजूदा सीमाएं खत्म हो जाती हैं. पाइपलाइन ऑपरेशन में, क्वेरी की सैकड़ों अतिरिक्त सुविधाएं मिलती हैं. पाइपलाइन ऑपरेशन में ये सुविधाएं होती हैं:
स्टेज-आधारित कंपोज़ेबल सिंटैक्स
पाइपलाइन क्वेरी, क्रम से चलने वाले स्टेज की सीरीज़ तय करके बनाई जाती हैं. ये स्टेज क्रम से चलते हैं. इससे, जटिल ऑपरेशन किए जा सकते हैं. जैसे, एग्रीगेशन के नतीजे पर फ़िल्टर करना. पहले यह सुविधा उपलब्ध नहीं थी.
यहां दिए गए उदाहरण में, एक पाइपलाइन क्वेरी दिखाई गई है. इससे, पिछले महीने में देखे गए यूनीक प्रॉडक्ट आईडी की संख्या का पता चलता है:
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(...)) के साथ-साथ, ग्रुपिंग के लिए अपनी पसंद के मुताबिक फ़ील्ड इस्तेमाल करने की सुविधा. - रिलेशनल जॉइन: कोरिलेटेड सबक्वेरी का इस्तेमाल करके, कलेक्शन और सबकलेक्शन में सर्वर-साइड जॉइन करना.
- जटिल फ़िल्टरिंग:
where(...)स्टेटमेंट को अपनी पसंद के मुताबिक जटिल बनाने के लिए, सैकड़ों अतिरिक्त फ़ंक्शन इस्तेमाल करने की सुविधा. इनमेंregex_match(...),add(...), औरstr_contains(...)शामिल हैं. इसके लिए, इंडेक्स से जुड़ी ज़रूरी शर्तें पूरी करना ज़रूरी नहीं है. - आंशिक तौर पर पढ़ना / प्रोजेक्शन:
select(...),remove_fields(...), और दस्तावेज़ में बदलाव करने के कई अन्य स्टेज का इस्तेमाल करके, दस्तावेज़ों के डाइनैमिक सबसेट वापस पाना.
इन सुविधाओं के बारे में ज़्यादा जानने के लिए, पाइपलाइन ऑपरेशन की मदद से क्वेरी करना लेख पढ़ें.
रीयल-टाइम और ऑफ़लाइन सहायता
रीयल-टाइम और ऑफ़लाइन सहायता का इस्तेमाल करने के लिए, डेवलपर Firestore Enterprise वर्शन में Firestore के मुख्य ऑपरेशन का इस्तेमाल कर सकते हैं.
क्लाइंट और टूलिंग इंटिग्रेशन
Enterprise वर्शन में, पाइपलाइन क्वेरी के साथ इंटरैक्ट करने और उन्हें मैनेज करने के लिए, खास सुविधाएं शामिल हैं:
- क्वेरी की जानकारी और प्रोफ़ाइलिंग: क्वेरी की जानकारी के नतीजों का इस्तेमाल करके, यह समझा जा सकता है कि कोई क्वेरी कितनी रीड या राइट यूनिट का इस्तेमाल करती है. साथ ही, इसके एक्ज़ीक्यूशन का विश्लेषण किया जा सकता है.
- क्वेरी की अहम जानकारी: Enterprise वर्शन में, क्वेरी की अहम जानकारी की सुविधा उपलब्ध है. इससे यह तय करने में मदद मिलती है कि परफ़ॉर्मेंस और लागत को बेहतर बनाने के लिए, इंडेक्स कहां बनाए जा सकते हैं. इसके लिए, यह सुविधा आपके डेटाबेस पर चलने वाली सबसे अहम क्वेरी और उनकी परफ़ॉर्मेंस की विशेषताओं की जानकारी देती है
- इंडेक्स के नए टाइप: Enterprise वर्शन के लिए, खास इंडेक्स बनाए जा सकते हैं. इनमें स्पार्स, नॉन-स्पार्स, और यूनीक इंडेक्स जैसे इंडेक्स टाइप शामिल हैं. इसमें, Enterprise डेटाबेस के लिए वेक्टर सर्च इंडेक्स बनाने और उनमें बदलाव करने की सुविधा भी है.
Firestore Standard वर्शन और Firestore Enterprise वर्शन के बीच अंतर
मुख्य ऑपरेशन और पाइपलाइन ऑपरेशन के बीच, ऑपरेशन से जुड़ा मुख्य अंतर इंडेक्सिंग को मैनेज करने में है. इससे परफ़ॉर्मेंस और लागत पर सीधे असर पड़ता है.
| स्टैंडर्ड वर्शन - मुख्य ऑपरेशन | Enterprise वर्शन - मुख्य ऑपरेशन और पाइपलाइन ऑपरेशन | |
| इंडेक्सिंग से जुड़ी ज़रूरी शर्त | क्वेरी के लिए इंडेक्स ज़रूरी हैं.
सिंगल फ़ील्ड के लिए इंडेक्स अपने-आप बन जाते हैं. वहीं, ज़्यादा जटिल क्वेरी के लिए, कंपोज़िट इंडेक्स या कलेक्शन ग्रुप इंडेक्स पर निर्भर रहना पड़ता है. इन्हें मैन्युअल तरीके से कॉन्फ़िगर करना होता है. |
क्वेरी के लिए इंडेक्स ज़रूरी नहीं हैं. इसलिए, इंडेक्स बनाना ज़रूरी नहीं है.
ज़रूरत के हिसाब से इंडेक्स तय किए जा सकते हैं. Enterprise वर्शन में, इंडेक्स के कई टाइप इस्तेमाल किए जा सकते हैं. इनमें नॉन-स्पार्स/स्पार्स और यूनीक इंडेक्स शामिल हैं. |
| इंडेक्स किए गए फ़ील्ड | अगर इंडेक्स किए गए फ़ील्ड में __name__ फ़ील्ड पहले से मौजूद नहीं है, तो यह फ़ील्ड अपने-आप जुड़ जाता है. | __name__ फ़ील्ड इंडेक्स किए गए फ़ील्ड में अपने-आप नहीं जुड़ता. अगर आपके ऐप्लिकेशन के लिए __name__ फ़ील्ड ज़रूरी है, तो आपको इंडेक्स किए गए फ़ील्ड में इसे साफ़ तौर पर तय करना होगा. |
| सॉर्ट ऑर्डर नॉर्मलाइज़ेशन | क्वेरी के 'ऑर्डर बाय' क्लॉज़ को नॉर्मलाइज़ किया जाता है. इसके लिए, असमानता वाले फ़ील्ड और __name__ फ़ील्ड को आखिर में जोड़ा जाता है. ऐसा तब किया जाता है, जब ये फ़ील्ड पहले से मौजूद न हों. इससे, नतीजों का क्रम यूनीक और तय होता है. भले ही, 'ऑर्डर बाय' क्लॉज़ में कोई भी फ़ील्ड मौजूद हो. | सॉर्ट ऑर्डर नॉर्मलाइज़ेशन की सुविधा उपलब्ध नहीं है. सॉर्ट ए एएससी जैसे सॉर्ट ऑर्डर से सिर्फ़ यह पक्का होता है कि नतीजे, ए फ़ील्ड के हिसाब से सॉर्ट किए गए हैं. Cloud Firestore, नतीजों को सबसे बेहतर क्रम में दिखाने के लिए, आपके मौजूदा इंडेक्स का इस्तेमाल करेगा. इसलिए, अगर नतीजों के सेट में ए यूनीक नहीं है, तो इंडेक्स कॉन्फ़िगरेशन, एक्ज़ीक्यूशन की रणनीतियों वगैरह के आधार पर, क्वेरी के हिसाब से नतीजों का क्रम अलग-अलग हो सकता है. नतीजों का क्रम यूनीक और तय करने के लिए, आपको सॉर्ट ऑर्डर में कोई यूनीक फ़ील्ड जोड़ना होगा. जैसे, __name__. |
| परफ़ॉर्मेंस | इंडेक्स की गई क्वेरी: परफ़ॉर्मेंस और लागत, नतीजों के सेट के साइज़ के हिसाब से बढ़ती है. |
इंडेक्स के बिना क्वेरी: परफ़ॉर्मेंस और लागत, डेटासेट के साइज़ के हिसाब से बढ़ती है. इंडेक्स की गई क्वेरी: परफ़ॉर्मेंस और लागत, नतीजों के सेट के साइज़ के हिसाब से बढ़ती है. हमारा सुझाव है कि इंडेक्स बनाने और क्वेरी की परफ़ॉर्मेंस और लागत को बेहतर बनाने के लिए, क्वेरी की जानकारी और क्वेरी की अहम जानकारी टूल का इस्तेमाल करें. |
| स्टोरेज की लागत पर असर | ऑटोमैटिक इंडेक्स और कंपोज़िट इंडेक्स की वजह से, स्टोरेज का ओवरहेड बढ़ जाता है. | स्टोरेज की लागत कम होती है, क्योंकि हर फ़ील्ड के लिए इंडेक्स अपने-आप नहीं बनते. |
| लागत का आधार | दस्तावेज़ को पढ़ने, लिखने, और मिटाने के हर ऑपरेशन के लिए शुल्क लिया जाता है. | रीड यूनिट (4 केबी के हिसाब से) और राइट यूनिट (1 केबी के हिसाब से) के हिसाब से शुल्क लिया जाता है. इंडेक्स एंट्री लिखने पर, राइट यूनिट का शुल्क लिया जाता है.
कीमतों में हुए बदलाव के बारे में कुछ उदाहरणों के साथ जानें. |
| सुरक्षा के नियम | सुरक्षा के नियम, रीड/राइट की अनुमतियों की पुष्टि करके, कलेक्शन को सुरक्षित रखते हैं. | सुरक्षा के नियम, रीड/राइट की अनुमतियों की पुष्टि करके, कलेक्शन को सुरक्षित रखते हैं. डेटा मॉडल गाइड में, पाइपलाइन क्वेरी के लिए डेटा को मॉडल करने का तरीका जानें. |