इस पेज पर, डेटा मिटाने के लिए कॉल की जा सकने वाली Cloud फ़ंक्शन का इस्तेमाल करने का तरीका बताया गया है. इस फ़ंक्शन को डिप्लॉय करने के बाद, इसे सीधे अपने मोबाइल ऐप्लिकेशन या वेबसाइट से कॉल किया जा सकता है. इससे दस्तावेज़ों और कलेक्शन को बार-बार मिटाया जा सकता है. उदाहरण के लिए, इस समाधान का इस्तेमाल करके, कुछ उपयोगकर्ताओं को पूरे कलेक्शन मिटाने की अनुमति दी जा सकती है.
कलेक्शन मिटाने के अन्य तरीकों के लिए, डेटा मिटाना लेख पढ़ें.
समाधान: कॉल की जा सकने वाली Cloud फ़ंक्शन की मदद से डेटा मिटाना
कम संसाधनों वाले मोबाइल ऐप्लिकेशन से पूरे कलेक्शन मिटाना मुश्किल हो सकता है. इसकी ये वजहें हैं:
- किसी कलेक्शन को एक साथ मिटाने की सुविधा उपलब्ध नहीं है.
- किसी दस्तावेज़ को मिटाने से, उसकी उप-संग्रह में मौजूद दस्तावेज़ नहीं मिटते.
- अगर आपके दस्तावेज़ों में डाइनैमिक सब-कलेक्शन हैं, तो किसी दिए गए पाथ के लिए कौनसा डेटा मिटाना है, यह जानना मुश्किल हो सकता है.
- 500 से ज़्यादा दस्तावेज़ों के कलेक्शन को मिटाने के लिए, कई बैच में लिखने की कार्रवाइयां या सैकड़ों बार मिटाने की कार्रवाइयां करनी पड़ती हैं.
- कई ऐप्लिकेशन में, यह सही नहीं है कि असली उपयोगकर्ताओं को पूरे कलेक्शन मिटाने की अनुमति दी जाए.
अच्छी बात यह है कि पूरे कलेक्शन या कलेक्शन ट्री को सुरक्षित तरीके से और बेहतर परफ़ॉर्मेंस के साथ मिटाने के लिए, कॉल की जा सकने वाली Cloud फ़ंक्शन लिखा जा सकता है. नीचे दिया गया Cloud फ़ंक्शन, कॉल किया जा सकने वाला फ़ंक्शन लागू करता है. इसका मतलब है कि इसे सीधे तौर पर आपके मोबाइल ऐप्लिकेशन या वेबसाइट से कॉल किया जा सकता है. ऐसा लोकल फ़ंक्शन के लिए किया जाता है.
फ़ंक्शन को डिप्लॉय करने और डेमो आज़माने के लिए, सैंपल कोड देखें.
Cloud फ़ंक्शन
नीचे दिया गया Cloud फ़ंक्शन, किसी कलेक्शन और उसके सभी डिसेंडेंट को मिटा देता है.
Cloud Functions के लिए, खुद का रिकर्सिव डिलीट लॉजिक लागू करने के बजाय, Firebase कमांड लाइन इंटरफ़ेस (सीएलआई) में firestore:delete
कमांड का इस्तेमाल किया जा सकता है. firebase-tools
पैकेज का इस्तेमाल करके, Firebase CLI के किसी भी फ़ंक्शन को अपने Node.js ऐप्लिकेशन में इंपोर्ट किया जा सकता है.
Firebase CLI, Cloud Firestore REST API का इस्तेमाल करके, तय किए गए पाथ के तहत मौजूद सभी दस्तावेज़ों को ढूंढता है और उन्हें अलग-अलग मिटाता है. इस सुविधा को लागू करने के लिए, आपको अपने ऐप्लिकेशन के डेटा के खास क्रम के बारे में जानकारी देने की ज़रूरत नहीं है. यह सुविधा, "अनाथ" दस्तावेज़ों को भी ढूंढकर मिटा देगी. ऐसे दस्तावेज़ों का कोई पैरंट नहीं होता.
Node.js
/** * Initiate a recursive delete of documents at a given path. * * The calling user must be authenticated and have the custom "admin" attribute * set to true on the auth token. * * This delete is NOT an atomic operation and it's possible * that it may fail after only deleting some documents. * * @param {string} data.path the document or collection path to delete. */ exports.recursiveDelete = functions .runWith({ timeoutSeconds: 540, memory: '2GB' }) .https.onCall(async (data, context) => { // Only allow admin users to execute this function. if (!(context.auth && context.auth.token && context.auth.token.admin)) { throw new functions.https.HttpsError( 'permission-denied', 'Must be an administrative user to initiate delete.' ); } const path = data.path; console.log( `User ${context.auth.uid} has requested to delete path ${path}` ); // Run a recursive delete on the given document or collection path. // The 'token' must be set in the functions config, and can be generated // at the command line by running 'firebase login:ci'. await firebase_tools.firestore .delete(path, { project: process.env.GCLOUD_PROJECT, recursive: true, force: true, token: functions.config().fb.token }); return { path: path }; });
क्लाइंट इनवोकेशन
फ़ंक्शन को कॉल करने के लिए, Firebase SDK से फ़ंक्शन का रेफ़रंस पाएं. इसके बाद, ज़रूरी पैरामीटर पास करें:
वेब
/** * Call the 'recursiveDelete' callable function with a path to initiate * a server-side delete. */ function deleteAtPath(path) { var deleteFn = firebase.functions().httpsCallable('recursiveDelete'); deleteFn({ path: path }) .then(function(result) { logMessage('Delete success: ' + JSON.stringify(result)); }) .catch(function(err) { logMessage('Delete failed, see console,'); console.warn(err); }); }
Swift
// Snippet not yet written
Objective-C
// Snippet not yet written
Kotlin
/** * Call the 'recursiveDelete' callable function with a path to initiate * a server-side delete. */ fun deleteAtPath(path: String) { val deleteFn = Firebase.functions.getHttpsCallable("recursiveDelete") deleteFn.call(hashMapOf("path" to path)) .addOnSuccessListener { // Delete Success // ... } .addOnFailureListener { // Delete Failed // ... } }
Java
/** * Call the 'recursiveDelete' callable function with a path to initiate * a server-side delete. */ public void deleteAtPath(String path) { Map<String, Object> data = new HashMap<>(); data.put("path", path); HttpsCallableReference deleteFn = FirebaseFunctions.getInstance().getHttpsCallable("recursiveDelete"); deleteFn.call(data) .addOnSuccessListener(new OnSuccessListener<HttpsCallableResult>() { @Override public void onSuccess(HttpsCallableResult httpsCallableResult) { // Delete Success // ... } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Delete failed // ... } }); }
कॉल किए जा सकने वाले Cloud Functions के लिए क्लाइंट SDK का इस्तेमाल करने पर, उपयोगकर्ता की पुष्टि करने की स्थिति और path
पैरामीटर को रिमोट फ़ंक्शन में आसानी से पास किया जाता है.
फ़ंक्शन पूरा होने पर, क्लाइंट को नतीजे या अपवाद के साथ कॉलबैक मिलेगा. Android, Apple या किसी अन्य प्लैटफ़ॉर्म से क्लाउड फ़ंक्शन को कॉल करने का तरीका जानने के लिए, दस्तावेज़ पढ़ें.
सीमाएं
ऊपर दिए गए समाधान में, कॉल किए जा सकने वाले फ़ंक्शन से कलेक्शन मिटाने का तरीका बताया गया है. हालांकि, आपको इन सीमाओं के बारे में पता होना चाहिए:
- संगति - ऊपर दिया गया कोड, एक बार में एक दस्तावेज़ मिटाता है. अगर मिटाने की प्रोसेस के दौरान क्वेरी की जाती है, तो हो सकता है कि आपको ऐसे नतीजे दिखें जिनमें कुछ ही दस्तावेज़ मिटाए गए हों. इस बात की भी कोई गारंटी नहीं है कि मिटाने की कार्रवाइयां एक जैसी होंगी. इसलिए, कुछ डेटा मिटाने के मामलों को मैनेज करने के लिए तैयार रहें.
- टाइमआउट - ऊपर दिया गया फ़ंक्शन, टाइम आउट होने से पहले ज़्यादा से ज़्यादा 540 सेकंड तक चलता है. मिटाने का कोड, सबसे अच्छे मामले में हर सेकंड 4,000 दस्तावेज़ मिटा सकता है. अगर आपको 20 लाख से ज़्यादा दस्तावेज़ मिटाने हैं, तो आपको अपने सर्वर पर यह कार्रवाई करनी चाहिए, ताकि यह टाइम आउट न हो. अपने सर्वर से किसी कलेक्शन को मिटाने का तरीका जानने के लिए, कलेक्शन मिटाना लेख पढ़ें.
- ज़्यादा दस्तावेज़ मिटाने पर, Google Cloud Console में डेटा व्यूअर को लोड होने में ज़्यादा समय लग सकता है या टाइमआउट की गड़बड़ी दिख सकती है.