احذف البيانات باستخدام وظيفة Callable Cloud

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

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

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

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

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

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

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

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

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

بدلا من تنفيذ الخاصة المنطق حذف العودية للحصول على وظيفة السحب الخاص بك، يمكنك الاستفادة من firestore:delete الأمر في Firebase واجهة سطر الأوامر (CLI). يمكنك استيراد أي وظيفة من Firebase CLI في تطبيق نود.جي إس الخاص بك باستخدام 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,
        yes: 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);
        });
}
سويفت
    // Snippet not yet written
    
ج موضوعية
    // Snippet not yet written
    

جافا

/**
 * 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 و iOS، أو منصة أخرى، وقراءة وثائق .

محددات

يوضح الحل الموضح أعلاه حذف المجموعات من وظيفة قابلة للاستدعاء ، ولكن يجب أن تكون على دراية بالقيود التالية:

  • الاتساق - رمز أعلاه حذف الوثائق في وقت واحد. إذا قمت بالاستعلام أثناء وجود عملية حذف جارية ، فقد تعكس نتائجك حالة كاملة جزئيًا حيث يتم حذف بعض المستندات المستهدفة فقط. لا يوجد أيضًا ضمان بأن عمليات الحذف ستنجح أو تفشل بشكل موحد ، لذا كن مستعدًا للتعامل مع حالات الحذف الجزئي.
  • مهلة - يتم تكوين وظيفة فوق لتشغيل لمدة أقصاها 540 ثانية قبل انتهاء المهلة. يمكن لرمز الحذف حذف 4000 مستند في الثانية في أفضل الأحوال. إذا كنت بحاجة إلى حذف أكثر من 2000000 مستند ، فيجب أن تفكر في تشغيل العملية على الخادم الخاص بك حتى لا تنتهي مهلتها. للحصول على مثال لكيفية حذف مجموعة من الخادم الخاص بك، انظر مجموعات حذف .