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