MongoDB के साथ काम करने वाले Firestore के लिए, स्ट्रीम में बदलाव की सुविधा उपलब्ध है. इसकी मदद से, ऐप्लिकेशन, कलेक्शन या पूरे डेटाबेस में किए गए रीयल-टाइम बदलावों (डेटा जोड़ने, अपडेट करने, और मिटाने) को ऐक्सेस कर सकते हैं. स्ट्रीम में बदलाव की सुविधा, बदलाव के समय के हिसाब से अपडेट को क्रम में लगाती है.
स्ट्रीम में बदलाव की सुविधा, MongoDB के साथ काम करने वाले एपीआई और MongoDB के पारंपरिक ड्राइवर की मदद से ऐक्सेस की जा सकती है. MongoDB के साथ काम करने वाले Firestore में, स्ट्रीम में बदलाव की सुविधा, लिखने और पढ़ने की किसी भी थ्रूपुट को हैंडल कर सकती है. इसके लिए, यह सुविधा, डेटा लिखने के दौरान अपने-आप पार्टीशन करने और डेटा को पैरलल में पढ़ने की यूनीक सुविधा का इस्तेमाल करती है. इससे, ज़्यादा थ्रूपुट वाले वर्कलोड बनाए जा सकते हैं. इसके अलावा, Cloud Firestore और स्टोरेज के अन्य समाधानों के बीच, माइग्रेशन और डेटा सिंक करने के इन्फ़्रास्ट्रक्चर को बेहतर बनाया जा सकता है.
MongoDB के ड्राइवर के साथ काम करने के अलावा, आप Cloud Firestore का इस्तेमाल करके, स्ट्रीम में बदलाव की सुविधा के तहत डेटा को पैरलल में पढ़ सकते हैं. इससे, ज़्यादा थ्रूपुट वाले वर्कलोड बनाए जा सकते हैं, जिन्हें पैरलल में पढ़ा जा सकता है. हर स्ट्रीम, नतीजों के अच्छी तरह से डिस्ट्रिब्यूट किए गए पार्टीशन को दिखाती है.
स्ट्रीम में बदलाव की सुविधा के तहत, इन सुविधाओं का इस्तेमाल किया जा सकता है:
- डेटाबेस या कलेक्शन के दायरे के साथ, स्ट्रीम में बदलाव की सुविधा को कॉन्फ़िगर किया जा सकता है.
- स्ट्रीम में बदलाव की सुविधा के लिए, डेटा के रखरखाव की अवधि तय की जा सकती है. यह अवधि, स्ट्रीम बनाते समय तय की जाती है. डिफ़ॉल्ट तौर पर, डेटा के रखरखाव की अवधि सात दिन होती है. हालांकि, इसे एक दिन तक कम किया जा सकता है. डेटा के रखरखाव की अवधि, एक दिन के मल्टीपल में होनी चाहिए. यह अवधि, ज़्यादा से ज़्यादा सात दिन हो सकती है. स्ट्रीम बनाने के बाद, डेटा के रखरखाव की अवधि बदली नहीं जा सकती. डेटा के रखरखाव की अवधि बदलने के लिए, आपको स्ट्रीम में बदलाव की सुविधा को हटाकर, उसे फिर से बनाना होगा.
delete,insert,update, औरdropमें बदलाव के इवेंट देखे जा सकते हैं. इसके लिए,db.collection.watch()औरdb.watch()का इस्तेमाल किया जा सकता है.updateDescription.updatedFieldsमें, अपडेट के अंतर शामिल होते हैं.- सभी
fullDocumentऔरfullDocumentBeforeChangeविकल्प.- अपडेट के लिए, पूरे दस्तावेज़ को देखना.
- दस्तावेज़ को बदलने, अपडेट करने या मिटाने से पहले की इमेज.
- दस्तावेज़ को बदलने या अपडेट करने के बाद की इमेज.
- एक घंटे से ज़्यादा पुरानी, पहले और बाद की इमेज देखने के लिए, पॉइंट-इन-टाइम रिकवरी (पीआईटीआर) की सुविधा चालू करनी होगी.
resumeAfterऔरstartAfterसहित, फिर से शुरू करने के सभी विकल्प.- बदलावों को देखने के लिए,
watch()का इस्तेमाल करते समय, एग्रीगेशन स्टेज को जोड़ा जा सकता है. जैसे,$addFields,$match,$project,$replaceRoot,$replaceWith,$set, और$unset.
स्ट्रीम में बदलाव की सुविधा को कॉन्फ़िगर करना
किसी डेटाबेस के लिए, स्ट्रीम में बदलाव की सुविधा को बनाने, हटाने या देखने के लिए, Google Cloud Console का इस्तेमाल करें.
भूमिकाएं और अनुमतियां
स्ट्रीम में बदलाव की सुविधा को बनाने, मिटाने, और उसकी सूची देखने के लिए, किसी प्रिंसिपल के पास, पहचान और ऐक्सेस मैनेजमेंट (आईएएम) की ये अनुमतियां होनी चाहिए: datastore.schemas.create, datastore.schemas.delete, और datastore.schemas.list.
उदाहरण के लिए, Datastore इंडेक्स एडमिन (roles/datastore.indexAdmin) की भूमिका से ये अनुमतियां मिलती हैं.
स्ट्रीम में बदलाव की सुविधा बनाना
स्ट्रीम में बदलाव की सुविधा का कर्सर खोलने से पहले, आपको स्ट्रीम में बदलाव की सुविधा बनानी होगी. कलेक्शन या डेटाबेस बनाते समय, स्ट्रीम में बदलाव की सुविधा को अपने-आप चालू करने की सुविधा मौजूद नहीं है.
स्ट्रीम में बदलाव की सुविधा बनाने के लिए, Google Cloud Console का इस्तेमाल करें.
-
Google Cloud Console में, डेटाबेस पेज पर जाएं.
- सूची में से, MongoDB के साथ काम करने वाला Firestore डेटाबेस चुनें. Firestore Studio पैनल खुलता है.
- एक्सप्लोरर पैनल में, स्ट्रीम में बदलाव की सुविधा नोड ढूंढें. इसके बाद, ज़्यादा कार्रवाइयां पर क्लिक करें. फिर, स्ट्रीम में बदलाव की सुविधा बनाएं को चुनें.
- स्ट्रीम में बदलाव की सुविधा के लिए कोई यूनीक नाम, दायरा, और डेटा के रखरखाव की अवधि डालें. इसके बाद, सेव करें पर क्लिक करें
स्ट्रीम में बदलाव की सुविधा देखना
Google Cloud Console में, स्ट्रीम में बदलाव की सुविधा के बारे में जानकारी देखी जा सकती है.
-
Google Cloud Console में, डेटाबेस पेज पर जाएं.
- सूची में से, MongoDB के साथ काम करने वाला Firestore डेटाबेस चुनें. Firestore Studio पैनल खुलता है.
- एक्सप्लोरर पैनल में, स्ट्रीम में बदलाव की सुविधा नोड ढूंढें.
- नोड को खोलने या बंद करने के लिए, नोड टॉगल करें पर क्लिक करें.
स्ट्रीम में बदलाव की सुविधा मिटाना
स्ट्रीम में बदलाव की सुविधा मिटाने के लिए, Google Cloud Console का इस्तेमाल करें.
-
Google Cloud Console में, डेटाबेस पेज पर जाएं.
- सूची में से, MongoDB के साथ काम करने वाला Firestore डेटाबेस चुनें. Firestore Studio पैनल खुलता है.
- एक्सप्लोरर पैनल में, स्ट्रीम में बदलाव की सुविधा नोड ढूंढें.
- नोड को खोलने या बंद करने के लिए, नोड टॉगल करें पर क्लिक करें.
- एक्सप्लोरर में, वह स्ट्रीम में बदलाव की सुविधा ढूंढें जिसे मिटाना है.
- ज़्यादा कार्रवाइयां पर क्लिक करें. इसके बाद, स्ट्रीम में बदलाव की सुविधा मिटाएं को चुनें.
- डायलॉग बॉक्स में, मिटाने की पुष्टि करने के लिए, स्ट्रीम में बदलाव की सुविधा का नाम डालें. इसके बाद, मिटाएं पर क्लिक करें.
स्ट्रीम में बदलाव की सुविधा का कर्सर खोलना या फिर से शुरू करना
यहां दिए गए उदाहरणों में, स्ट्रीम में बदलाव की सुविधा का कर्सर बनाने, फिर से शुरू करने, और कॉन्फ़िगर करने का तरीका बताया गया है.
स्ट्रीम में बदलाव की सुविधा का कर्सर बनाने से पहले, आपको डेटाबेस या कलेक्शन के लिए, स्ट्रीम में बदलाव की सुविधा बनानी होगी.
स्ट्रीम में बदलाव की सुविधा का कर्सर बनाना
स्ट्रीम में बदलाव की सुविधा का नया कर्सर बनाने के लिए, MongoDB के ड्राइवर में watch तरीके का इस्तेमाल करें.
किसी डेटाबेस में होने वाले सभी बदलावों को सुनने के लिए, डेटाबेस के दायरे वाली स्ट्रीम में बदलाव की सुविधा बनाएं. इसके बाद, db ऑब्जेक्ट पर watch तरीके को कॉल करें.
let cursor = db.watch()
कलेक्शन के दायरे वाला कर्सर बनाने के लिए, आपको पहले उस कलेक्शन के लिए, स्ट्रीम में बदलाव की सुविधा बनानी होगी. इसके बाद, उससे जुड़े कलेक्शन पर watch तरीके को कॉल करें.
let cursor = db.my_collection.watch()
स्ट्रीम में बदलाव की सुविधा का कर्सर बनाने के बाद, स्ट्रीमिंग शुरू की जा सकती है.
उदाहरण के लिए, अगर कोई दस्तावेज़ जोड़ा जाता है और कर्सर पर tryNext को कॉल किया जाता है, तो आपको स्ट्रीम में बदलाव की सुविधा पर वह बदलाव दिखेगा.
let doc = db.my_collection.insertOne({value: "hello world"}) console.log(cursor.tryNext())
अगर दस्तावेज़ को अपडेट और मिटाया जाता है, तो आपको स्ट्रीम में बदलाव की सुविधा पर वे बदलाव दिखेंगे:
db.my_collection.updateOne({"_id": doc.insertedId}, {$set: {value: "hello world!"}}) db.my_collection.deleteOne({"_id": doc.insertedId}}) // Prints the update event console.log(cursor.tryNext()) // Prints the delete event console.log(cursor.tryNext())
स्ट्रीम में बदलाव की सुविधा फिर से शुरू करना
स्ट्रीम में बदलाव की सुविधा फिर से शुरू करने के लिए, resumeAfter या startAfter विकल्पों का इस्तेमाल करें.
resumeAfter और startAfter से, बदलाव लॉग में कहां से फिर से शुरू करना है, यह तय करने के लिए, रीज़्यूम टोकन का इस्तेमाल करें.
// Create a cursor and add one event to the change stream. let cursor = db.my_collection.watch(); db.my_collection.insertOne({value: "hello world"}); let event = cursor.tryNext(); // Get the resume token from the event. let resumeToken = event._id; // Add a new event to the change stream. db.my_collection.insertOne({value: "foobar"}); // Create a new cursor by using the resume token as a starting point. let newCursor = db.my_collection.watch({resumeAfter: resumeToken}) // Log the change event containing the "foobar" value. console.log(newCursor.tryNext())
startAfter का इस्तेमाल करने के लिए:
// Start after the resume token. let startAfterCursor = db.my_collection.watch({startAfter: resumeToken})
अपडेट और मिटाने की कार्रवाइयों में, पहले और बाद की इमेज शामिल करना
ज़रूरत पड़ने पर, अपडेट और मिटाने की कार्रवाइयों में, दस्तावेज़ों की पहले और बाद की इमेज शामिल की जा सकती हैं. इमेज की उपलब्धता, पॉइंट-इन-टाइम रिकवरी (पीआईटीआर) विंडो पर निर्भर करती है. साथ ही, एक घंटे से ज़्यादा पुरानी दस्तावेज़ की इमेज पढ़ने के लिए, आपको पीआईटीआर की सुविधा चालू करनी होगी.
स्ट्रीम में बदलाव की सुविधा, पीआईटीआर विंडो का फ़ायदा उठाकर, बदलाव के दिए गए इवेंट से पहले और बाद में दस्तावेज़ का व्यू दिखाती है. डिफ़ॉल्ट तौर पर, अपडेट इवेंट में updateDescription फ़ील्ड शामिल होता है. यह फ़ील्ड, अपडेट की कार्रवाई से बदले गए फ़ील्ड का डेल्टा होता है.
बदलाव के किसी इवेंट में, पहले और बाद की इमेज शामिल करने के लिए,
आपको
fullDocumentBeforeChange और fullDocument विकल्प, स्ट्रीम में बदलाव की सुविधा की क्वेरी में तय करने होंगे.
let cursor = db.my_collection.watch({ "fullDocument": "required", "fullDocumentBeforeChange": "required" })
अगर क्वेरी, पीआईटीआर के डेटा के रखरखाव की अवधि से बाहर के किसी दस्तावेज़ को पढ़ने की कोशिश करती है या अगर पीआईटीआर की सुविधा चालू नहीं है, तो required वैल्यू, सर्वर-साइड गड़बड़ी का मैसेज दिखाती है.
गड़बड़ी दिखाने के बजाय, whenAvailable वैल्यू का इस्तेमाल किया जा सकता है. इससे, इमेज उपलब्ध न होने पर, null वैल्यू दिखती है.
let cursor = db.my_collection.watch({ "fullDocument": "whenAvailable", "fullDocumentBeforeChange": "whenAvailable" })
अपडेट में, मौजूदा इमेज शामिल करना
डिफ़ॉल्ट तौर पर, अपडेट इवेंट में updateDescription फ़ील्ड शामिल होता है. यह फ़ील्ड, अपडेट की कार्रवाई से बदले गए फ़ील्ड का डेल्टा होता है. इसके बजाय, पूरे दस्तावेज़ का सबसे नया वर्शन देखने के लिए, fullDocument विकल्प में updateLookup वैल्यू का इस्तेमाल करें.
इस सुविधा के लिए, पीआईटीआर की ज़रूरत नहीं होती. साथ ही, यह दस्तावेज़ के लिए लुकअप की कार्रवाई करती है.
let cursor = db.my_collection.watch({ "fullDocument": "updateLookup", })
पैरलल में पढ़ना
थ्रूपुट बढ़ाने के लिए, firestoreWorkerConfig विकल्प का इस्तेमाल करके, स्ट्रीम में बदलाव की सुविधा की क्वेरी को कई वर्कर में बांटा जा सकता है. हर वर्कर, दस्तावेज़ों के अलग-अलग सेट के लिए, बदलावों को दिखाने के लिए ज़िम्मेदार होता है. runCommand या aggregate क्वेरी की मदद से, पैरलल कर्सर बनाना होगा.
उदाहरण के लिए, स्ट्रीम में बदलाव की सुविधा को तीन वर्कर में इस तरह बांटा जा सकता है:
let cursor1 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 0 }} }]); let cursor2 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 1 }} }]); let cursor3 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 2 }} }]);
स्ट्रीम में बदलाव की सुविधा और बैकअप
बैकअप रीस्टोर करने की कार्रवाइयों में, स्ट्रीम में बदलाव की सुविधा का कॉन्फ़िगरेशन या स्ट्रीम में बदलाव की सुविधा का डेटा उपलब्ध नहीं होता. अगर स्ट्रीम में बदलाव की सुविधा वाले किसी डेटाबेस को रीस्टोर किया जाता है, तो आपको डेस्टिनेशन डेटाबेस में, स्ट्रीम में बदलाव की उन सुविधाओं को फिर से बनाना होगा, ताकि उस डेटाबेस के कर्सर खोले जा सकें.
बिलिंग
- स्ट्रीम में बदलाव की सुविधा के लिए, रीड यूनिट और स्टोरेज की लागत लगती है. स्ट्रीम में बदलाव की सुविधा की कीमत देखें.
- रीड अनुरोध के समय, एक घंटे से ज़्यादा पुरानी, पहले और बाद की इमेज शामिल करने के लिए, पीआईटीआर की सुविधा चालू करनी होगी. इसके लिए, पीआईटीआर की लागत लगती है.
व्यवहार में अंतर
इस सेक्शन में, MongoDB के साथ काम करने वाले Firestore और MongoDB के बीच, स्ट्रीम में बदलाव की सुविधा में अंतर के बारे में बताया गया है.
updateDescription
updateDescription एक दस्तावेज़ है जो update इवेंट में मौजूद है. इसमें उन फ़ील्ड के बारे में बताया जाता है
जिन्हें अपडेट की कार्रवाई से अपडेट या हटाया गया है.
Cloud Firestore में, ये अहम अंतर हैं:
updateDescriptionमें,truncatedArraysऔरdisambiguatedPathsफ़ील्ड नहीं भरे जाते.updateDescription.updatedFields, म्यूटेशन लागू होने से पहले और बाद में, दस्तावेज़ की पहले और बाद की इमेज के बीच, कैननिकल अंतर दिखाते हैं.
किसी दस्तावेज़ की शुरुआती स्थिति देखें:
db.my_collection.insertOne({ _id: 1, root: { array: [{a: 1}, {b: 2}, {c: 3}] } })
पहली स्थिति: सिर्फ़ कलेक्शन के पहले एलिमेंट में बदलाव करना.
इस स्थिति में, Cloud Firestore का व्यवहार, MongoDB के जैसा होता है.
db.my_collection.updateOne( {_id: 1}, {'$set': {"root.array.0.a": 100}} ) { updatedFields: {"root.array.0.a": 100}, removedFields: [] }
दूसरी स्थिति: पूरे कलेक्शन को ओवरराइट करना
इस स्थिति में, कार्रवाई से सिर्फ़ पहले कलेक्शन फ़ील्ड को अपडेट किया जाता है. हालांकि, पूरे कलेक्शन को ओवरराइट किया जाता है.
Cloud Firestore में, अपडेट के अंतर में इन दोनों स्थितियों के बीच अंतर नहीं किया जाता. साथ ही, दोनों के लिए एक ही updateDescription.updatedFields दिखाया जाता है:
db.my_collection.updateOne( {_id: 1}, {'$set': {"root.array": [{a: 100}, {b: 2}, {c: 3}]}} ) // In other implementations, updatedFields reflects the mutation itself { updatedFields: { "root.array": [{a: 100}, {b: 2}, {c: 3}] }, removedFields: [] } // Firestore updatedFields is the diff between the before and after versions of the document { updatedFields: {"root.array.0.a": 100}, removedFields: [] }