कॉल करने योग्य क्लाउड फ़ंक्शन के साथ डेटा हटाएं

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

संग्रह हटाने के अन्य तरीकों के लिए, डेटा हटाएं देखें.

समाधान: कॉल करने योग्य क्लाउड फ़ंक्शन के साथ डेटा हटाएं

संसाधन-सीमित मोबाइल ऐप से संपूर्ण संग्रह हटाना निम्नलिखित कारणों से लागू करना मुश्किल हो सकता है:

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

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

फ़ंक्शन को परिनियोजित करने और डेमो आज़माने के लिए, नमूना कोड देखें।

क्लाउड फंक्शन

नीचे दिया गया क्लाउड फ़ंक्शन संग्रह और उसके सभी वंशजों को हटा देता है।

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

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);
        });
}
तीव्र
नोट: यह उत्पाद watchOS और ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
    // Snippet not yet written
    
उद्देश्य सी
नोट: यह उत्पाद watchOS और ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
    // Snippet not yet written
    

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

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
                // ...
            }
}

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

सीमाओं

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

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