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

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

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

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

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

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

لحسن الحظ، يمكنك كتابة دالة Cloud يمكن استدعاءها لحذف مجموعات كاملة أو أشجار مجموعات كاملة بشكل آمن وفعّال. تنفِّذ دالة Cloud أدناه دالة قابلة للاستدعاء، مما يعني أنه يمكن استدعاؤها مباشرةً من التطبيق للأجهزة الجوّالة أو الموقع الإلكتروني كما تفعل مع دالة محلية.

لتفعيل الدالة وتجربة عرض توضيحي، يُرجى الاطّلاع على نموذج الرمز.

وظيفة السحابة الإلكترونية

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

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

يستخدم واجهة سطر الأوامر في Firebase واجهة برمجة تطبيقات Cloud Firestore REST للعثور على جميع المستندات ضمن المسار المحدّد وحذفها بشكل فردي. لا يتطلّب هذا التنفيذ معرفة التسلسل الهرمي للبيانات الخاصة بتطبيقك، وقد يتم أيضًا العثور على المستندات "المعزولة" التي لم تعُد لها سمة رئيسية وحذفها.

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

استدعاء العميل

لاستدعاء الدالة، احصل على مرجع إلى الدالة من حزمة SDK لمنصة Firebase ومرر المعلمات المطلوبة:

الويب
/**
 * 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 مستند، فيجب عليك تنفيذ العملية على خادمك الخاص كي لا تنتهي مهلة. للاطّلاع على مثال حول كيفية حذف مجموعة من خادمك، يمكنك مراجعة حذف المجموعات.