नेटिव मोड में Firestore के बारे में खास जानकारी

नेटिव मोड में 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 डेटाबेस के लिए, वेक्टर सर्च इंडेक्स बनाने और उनमें बदलाव करने की सुविधा भी देता है.

Firestore Standard वर्शन और Firestore Enterprise वर्शन के बीच अंतर

कोर ऑपरेशन और पाइपलाइन ऑपरेशन के बीच मुख्य अंतर, इंडेक्स करने के मैनेजमेंट में होता है. इसका सीधा असर परफ़ॉर्मेंस और लागत पर पड़ता है.

स्टैंडर्ड वर्शन - मुख्य कार्रवाइयां Enterprise वर्शन - मुख्य कार्रवाइयां और पाइपलाइन से जुड़ी कार्रवाइयां
इंडेक्स करने से जुड़ी ज़रूरी शर्त क्वेरी के लिए इंडेक्स ज़रूरी हैं.

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

इंडेक्स ज़रूरी नहीं हैं. इसलिए, क्वेरी के लिए ये ज़रूरी नहीं हैं.

ज़रूरत के हिसाब से इंडेक्स तय किए जा सकते हैं. Enterprise वर्शन में, कई तरह के इंडेक्स टाइप भी काम करते हैं. इनमें स्पार्स/नॉन-स्पार्स और यूनीक इंडेक्स शामिल हैं.

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

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

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

हमारा सुझाव है कि इंडेक्स बनाने और क्वेरी की परफ़ॉर्मेंस को बेहतर बनाने के लिए, क्वेरी एक्सप्लेन और क्वेरी इनसाइट टूल का इस्तेमाल करें. इससे क्वेरी की लागत भी कम होगी.

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

उदाहरणों की मदद से, कीमत तय करने के नए मॉडल के बारे में जानें.

सुरक्षा से जुड़े नियम सुरक्षा के नियम, कलेक्शन को सुरक्षित रखते हैं. इसके लिए, वे पढ़ने/फ़ाइल या एंट्री में बदलाव करने की अनुमति की पुष्टि करते हैं. सुरक्षा के नियम, कलेक्शन को सुरक्षित रखते हैं. इसके लिए, वे पढ़ने/फ़ाइल या एंट्री में बदलाव करने की अनुमति की पुष्टि करते हैं. डेटा मॉडल गाइड में, पाइपलाइन क्वेरी के साथ काम करने के लिए, डेटा को मॉडल करने का तरीका जानें.