تصف الصفحة كيفية استخدام وظيفة Cloud قابلة للاستدعاء لحذف البيانات. بمجرد نشر هذه الوظيفة ، يمكنك الاتصال بها مباشرة من تطبيق الهاتف المحمول أو موقع الويب الخاص بك لحذف المستندات والمجموعات بشكل متكرر. على سبيل المثال ، يمكنك استخدام هذا الحل لمنح المستخدمين المحددين القدرة على حذف المجموعات بأكملها.
للحصول على طرق أخرى لحذف المجموعات ، راجع حذف البيانات .
الحل: احذف البيانات باستخدام وظيفة Cloud قابلة للاستدعاء
قد يكون حذف مجموعات كاملة من تطبيق جوّال محدود الموارد صعب التنفيذ للأسباب التالية:
- لا توجد عملية تحذف مجموعة بشكل ذري.
- لا يؤدي حذف مستند إلى حذف المستندات الموجودة في مجموعاته الفرعية.
- إذا كانت مستنداتك تحتوي على مجموعات فرعية ديناميكية ، فقد يكون من الصعب معرفة البيانات التي يجب حذفها لمسار معين.
- يتطلب حذف مجموعة من أكثر من 500 مستند عمليات كتابة مجمعة متعددة أو مئات من عمليات الحذف الفردية.
- في العديد من التطبيقات ، ليس من المناسب منح المستخدمين النهائيين الإذن لحذف مجموعات كاملة.
لحسن الحظ ، يمكنك كتابة وظيفة Cloud قابلة للاستدعاء لتشغيل عمليات حذف آمنة وفعالة لمجموعات كاملة أو أشجار المجموعة. تنفذ وظيفة السحابة أدناه وظيفة قابلة للاستدعاء مما يعني أنه يمكن استدعاؤها مباشرة من تطبيق الهاتف المحمول أو موقع الويب الخاص بك كما تفعل لوظيفة محلية.
لنشر الوظيفة وتجربة العرض التوضيحي ، راجع نموذج التعليمات البرمجية .
وظيفة السحابة
تحذف وظيفة السحابة أدناه مجموعة وجميع المتفرعات منها.
بدلاً من تنفيذ منطق الحذف المتكرر الخاص بك لوظيفة السحابة الخاصة بك ، يمكنك الاستفادة من firestore:delete
الأمر في Firebase Command Line Interface (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); }); }
سويفت
// Snippet not yet written
ج موضوعية
// 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 مستند في الثانية في أفضل الأحوال. إذا كنت بحاجة إلى حذف أكثر من 2000000 مستند ، فيجب أن تفكر في تشغيل العملية على الخادم الخاص بك حتى لا تنتهي مهلتها. للحصول على مثال حول كيفية حذف مجموعة من الخادم الخاص بك ، راجع حذف المجموعات .