कॉल करने लायक क्लाउड फ़ंक्शन से डेटा मिटाना

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

कलेक्शन मिटाने के अन्य तरीकों के बारे में जानने के लिए, डेटा मिटाना लेख पढ़ें.

समाधान: कॉल करने लायक Cloud फ़ंक्शन से डेटा मिटाना

सीमित संसाधनों वाले मोबाइल ऐप्लिकेशन से पूरे कलेक्शन को मिटाना मुश्किल हो सकता है नीचे दी गई वजहों से लागू किया जा सकता है:

  • ऐसा कोई भी तरीका नहीं है जो कलेक्शन को अपने-आप मिटाता हो.
  • किसी दस्तावेज़ को मिटाने पर, उसके सब-कलेक्शन में मौजूद दस्तावेज़ नहीं मिटते.
  • अगर आपके दस्तावेज़ों के डाइनैमिक सब-कलेक्शन हैं, तो यह जानना मुश्किल हो सकता है कि दिए गए पाथ का डेटा मिटाने के लिए.
  • 500 से ज़्यादा दस्तावेज़ों के कलेक्शन को मिटाने के लिए, एक से ज़्यादा दस्तावेज़ों की ज़रूरत होती है बैच में लिखने की प्रोसेस या सैकड़ों बार मिटाने के विकल्प.
  • कई ऐप्लिकेशन में, असली उपयोगकर्ताओं को ऐप्लिकेशन मिटाने की अनुमति देना सही नहीं है पूरा संग्रह.

अच्छी बात यह है कि आप कॉल करने लायक क्लाउड फ़ंक्शन लिख सकते हैं पूरे कलेक्शन या कलेक्शन ट्री को सुरक्षित तरीके से मिटाने और बेहतर परफ़ॉर्मेंस देने के लिए. नीचे दिया गया Cloud Function, कॉल करने वाला फ़ंक्शन लागू करता है इसका मतलब है कि इसे सीधे आपके मोबाइल ऐप्लिकेशन या वेबसाइट से कॉल किया जा सकता है, एक स्थानीय फ़ंक्शन के लिए किया जा सकता है.

फ़ंक्शन को डिप्लॉय करने और डेमो आज़माने के लिए, सैंपल कोड देखें.

Cloud फ़ंक्शन

नीचे दिया गया Cloud Function, किसी कलेक्शन और उसके सभी डिसेंडेंट को मिटा देता है.

अपने Cloud फ़ंक्शन के लिए, बार-बार होने वाले मिटाएं लॉजिक को लागू करने के बजाय, आप यहां दिए गए firestore:delete निर्देश का फ़ायदा ले सकते हैं Firebase कमांड लाइन इंटरफ़ेस (सीएलआई). का कोई भी फ़ंक्शन इंपोर्ट किया जा सकता है firebase-tools पैकेज का इस्तेमाल करके, अपने Node.js ऐप्लिकेशन में Firebase सीएलआई जोड़ें.

Firebase सीएलआई, Cloud Firestore REST API का इस्तेमाल करता है का इस्तेमाल करें. इसकी मदद से, दिए गए पाथ में सभी दस्तावेज़ों को ढूंढा जा सकता है. इसे लागू करने के लिए, आपके ऐप्लिकेशन के डेटा हैरारकी की जानकारी होना ज़रूरी नहीं है और "orphaned" को ढूंढ कर मिटा भी देगा ऐसे दस्तावेज़ जिनमें अब पैरंट.

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
ध्यान दें: यह प्रॉडक्ट WatchOS और App Clip टारगेट पर उपलब्ध नहीं है.
    // Snippet not yet written
    
Objective-C
ध्यान दें: यह प्रॉडक्ट WatchOS और App Clip टारगेट पर उपलब्ध नहीं है.
    // Snippet not yet written
    

Kotlin+KTX

/**
 * 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
                    // ...
                }
            });
}

कॉल करने लायक क्लाउड फ़ंक्शन के लिए, क्लाइंट SDK टूल का इस्तेमाल करके, उपयोगकर्ताओं की स्टेट और path पैरामीटर को आसानी से रिमोट फ़ंक्शन को पास कर दिया जाता है. जब फ़ंक्शन पूरा हो जाता है, तो क्लाइंट को कोई अपवाद हो सकता है. क्लाउड फ़ंक्शन को कॉल करने का तरीका जानने के लिए Android, Apple या किसी दूसरे प्लैटफ़ॉर्म पर मौजूद दस्तावेज़ पढ़ें.

सीमाएं

ऊपर दिखाया गया समाधान, कॉल किए जा सकने वाले कलेक्शन से कलेक्शन मिटाने का तरीका बताता है फ़ंक्शन का इस्तेमाल कर सकते हैं, लेकिन आपको इन सीमाओं का ध्यान रखना चाहिए:

  • नियमितता - ऊपर दिया गया कोड, दस्तावेज़ों को एक-एक करके मिटाता है. अगर आपको क्वेरी को हटाने की कार्रवाई जारी रहने के दौरान, आपके नतीजे पूरी तरह से प्रोसेस नहीं होती. इसमें, टारगेट किए गए सिर्फ़ कुछ दस्तावेज़ मिटाए जाते हैं. इस बात की भी कोई गारंटी नहीं है कि प्रोफ़ाइल मिटाने की कार्रवाई सफल होगी या समान रूप से विफल रहे, इसलिए आंशिक रूप से हटाए जाने के मामलों को हैंडल करने के लिए तैयार रहें.
  • टाइमआउट - ऊपर दिए गए फ़ंक्शन को ज़्यादा से ज़्यादा 540 तक चलाने के लिए कॉन्फ़िगर किया गया है समय खत्म होने से कुछ सेकंड पहले. मिटाने का कोड 4000 को मिटा सकता है सबसे अच्छी स्थिति में दस्तावेज़ प्रति सेकंड. अगर आपको इससे ज़्यादा डेटा मिटाना है, तो 2,000,000 दस्तावेज़, आपको खुद ही ऑपरेशन चलाने पर विचार करना चाहिए सर्वर को अपडेट करने की कोशिश करें, ताकि उसका समय खत्म न हो. उदाहरण के लिए, कि अगर आपको कलेक्शन मिटाना है, तो कलेक्शन मिटाएं देखें.