احذف البيانات باستخدام وظيفة السحابة القابلة للاستدعاء

تصف الصفحة كيفية استخدام وظيفة السحابة القابلة للاستدعاء لحذف البيانات. بمجرد نشر هذه الوظيفة، يمكنك استدعاؤها مباشرة من تطبيق الهاتف المحمول أو موقع الويب الخاص بك لحذف المستندات والمجموعات بشكل متكرر. على سبيل المثال، يمكنك استخدام هذا الحل لمنح مستخدمين محددين القدرة على حذف المجموعات بأكملها.

للتعرف على طرق أخرى لحذف المجموعات، راجع حذف البيانات .

الحل: حذف البيانات باستخدام وظيفة السحابة القابلة للاستدعاء

قد يكون من الصعب تنفيذ حذف مجموعات كاملة من تطبيق جوال محدود الموارد للأسباب التالية:

  • لا توجد عملية تحذف المجموعة ذريًا.
  • لا يؤدي حذف مستند إلى حذف المستندات الموجودة في مجموعاته الفرعية.
  • إذا كانت مستنداتك تحتوي على مجموعات فرعية ديناميكية، فقد يكون من الصعب معرفة البيانات التي يجب حذفها لمسار معين.
  • يتطلب حذف مجموعة مكونة من أكثر من 500 مستند عمليات كتابة مجمعة متعددة أو مئات من عمليات الحذف الفردية.
  • في العديد من التطبيقات، ليس من المناسب منح المستخدمين النهائيين الإذن بحذف المجموعات بأكملها.

لحسن الحظ، يمكنك كتابة دالة سحابية قابلة للاستدعاء لتشغيل عمليات حذف آمنة وفعالة للمجموعات بأكملها أو أشجار المجموعة. تنفذ وظيفة السحابة أدناه وظيفة قابلة للاستدعاء مما يعني أنه يمكن استدعاؤها مباشرة من تطبيق الهاتف المحمول أو موقع الويب الخاص بك كما تفعل مع وظيفة محلية.

لنشر الوظيفة وتجربة العرض التوضيحي، راجع نموذج التعليمات البرمجية .

وظيفة السحابة

تقوم وظيفة السحابة أدناه بحذف المجموعة وجميع فروعها.

بدلاً من تنفيذ منطق الحذف العودي الخاص بك لوظيفة السحابة الخاصة بك، يمكنك الاستفادة من أمر firestore:delete في واجهة سطر أوامر Firebase (CLI). يمكنك استيراد أي وظيفة من Firebase CLI إلى تطبيق Node.js الخاص بك باستخدام حزمة firebase-tools .

يستخدم 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 وApp Clip.
    // Snippet not yet written
    
ج موضوعية
ملاحظة: هذا المنتج غير متوفر في أنظمة 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 مستند، فيجب أن تفكر في تشغيل العملية على الخادم الخاص بك حتى لا تنتهي مهلة هذه العملية. للحصول على مثال حول كيفية حذف مجموعة من الخادم الخاص بك، راجع حذف المجموعات .