توضّح الصفحة كيفية استخدام دالة Cloud Function قابل للاتّصال لحذف البيانات. بعد نشر هذه الدالة، يمكنك استدعاؤها مباشرةً من تطبيقك المتوافق مع الأجهزة الجوّالة أو موقعك الإلكتروني ل حذف المستندات والمجموعات بشكل متكرّر. على سبيل المثال، يمكنك استخدام هذا الحلّ لمنح مستخدمين محدّدين إمكانية حذف مجموعات بأكملها.
للاطّلاع على طرق أخرى لحذف المجموعات، يُرجى الاطّلاع على حذف البيانات.
الحلّ: حذف البيانات باستخدام دالة Cloud Function قابلة للاستدعاء
قد يكون من الصعب تنفيذ حذف مجموعات كاملة من تطبيق متوافق مع الأجهزة الجوّالة محدود الموارد للأسباب التالية:
- لا تتوفّر عملية لحذف مجموعة بشكلٍ تام.
- لا يؤدي حذف مستند إلى حذف المستندات في مجموعاته الفرعية.
- إذا كانت مستنداتك تحتوي على مجموعات فرعية ديناميكية، قد يكون من الصعب معرفة البيانات التي يجب حذفها لمسار معيّن.
- يتطلّب حذف مجموعة من أكثر من 500 مستند عدّة عمليات كتابة مجمّعة أو مئات عمليات الحذف الفردية.
- في العديد من التطبيقات، لا يكون من المناسب منح المستخدمين النهائيين الإذن بحذف المجموعات بأكملها.
لحسن الحظ، يمكنك كتابة وظيفة قابلة للاستدعاء في Cloud لإتمام عمليات حذف آمنة وعالية الأداء للمجموعات أو أشجار المجموعات بالكامل. تنفِّذ دالة السحابة الإلكترونية أدناه دالة قابلة للطلب، ما يعني أنّه يمكن طلبها مباشرةً من تطبيقك المتوافق مع الأجهزة الجوّالة أو موقعك الإلكتروني كما هو الحال مع الدالة المحلية.
لنشر الدالة وتجربة عرض توضيحي، اطّلِع على نموذج التعليمات البرمجية.
وظيفة السحابة الإلكترونية
تحذف دالة Cloud Function أدناه مجموعة وجميع العناصر الفرعية لها.
بدلاً من تنفيذ منطق الحذف المتكرّر لوظيفتك على Cloud،
يمكنك الاستفادة من الأمر firestore:delete
في
واجهة سطر الأوامر في Firebase (CLI). يمكنك استيراد أيّ دالة من أدوات برمجة التطبيقات في firebase-tools
إلى تطبيقك المستنِد إلى 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 }; });
استدعاء العميل
لاستدعاء الدالة، احصل على إشارة إلى الدالة من حزمة تطوير البرامج (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
// Snippet not yet written
Objective-C
// 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 ثانية كحد أقصى قبل انتهاء المهلة. يمكن لرمز الحذف حذف 4,000 مستند في الثانية في أفضل الأحوال. إذا كنت بحاجة إلى حذف أكثر من 2,000,000 مستند، ننصحك بتنفيذ العملية على الخادم الخاص بك حتى لا تنتهي مهلة العملية. للحصول على مثال على كيفية حذف مجموعة من خادمك، اطّلِع على حذف المجموعات.
- قد يؤدي حذف عدد كبير من المستندات إلى تحميل "عارض البيانات" في وحدة تحكّم Google Cloud ببطء أو إلى ظهور خطأ في مهلة الانتظار.