این صفحه نحوه استفاده از یک تابع ابری قابل فراخوانی برای حذف دادهها را شرح میدهد. پس از استقرار این تابع، میتوانید آن را مستقیماً از برنامه تلفن همراه یا وبسایت خود فراخوانی کنید تا اسناد و مجموعهها را به صورت بازگشتی حذف کنید. به عنوان مثال، میتوانید از این راهکار برای دادن امکان حذف کل مجموعهها به کاربران منتخب استفاده کنید.
برای روشهای دیگر حذف مجموعهها، به حذف دادهها مراجعه کنید.
راه حل: حذف دادهها با یک تابع ابری قابل فراخوانی
حذف کل مجموعهها از یک برنامه تلفن همراه با منابع محدود میتواند به دلایل زیر دشوار باشد:
- هیچ عملیاتی وجود ندارد که به صورت اتمی یک مجموعه را حذف کند.
- حذف یک سند، اسناد موجود در زیرمجموعههای آن را حذف نمیکند.
- اگر اسناد شما زیرمجموعههای پویا داشته باشند، دانستن اینکه چه دادههایی را باید برای یک مسیر مشخص حذف کنید، میتواند دشوار باشد.
- حذف مجموعهای شامل بیش از ۵۰۰ سند نیازمند چندین عملیات نوشتن دستهای یا صدها حذف تکی است.
- در بسیاری از برنامهها، دادن اجازه به کاربران نهایی برای حذف کل مجموعهها مناسب نیست.
خوشبختانه، میتوانید یک تابع ابری قابل فراخوانی بنویسید تا حذفهای ایمن و کارآمد کل مجموعهها یا درختهای مجموعه را اجرا کند. تابع ابری زیر یک تابع قابل فراخوانی را پیادهسازی میکند، به این معنی که میتوان آن را مستقیماً از برنامه تلفن همراه یا وبسایت شما فراخوانی کرد، همانطور که برای یک تابع محلی انجام میدهید.
برای پیادهسازی تابع و امتحان کردن یک نسخه آزمایشی، به کد نمونه مراجعه کنید.
عملکرد ابری
تابع Cloud زیر یک مجموعه و تمام زیرمجموعههای آن را حذف میکند.
به جای پیادهسازی منطق حذف بازگشتی خودتان برای تابع ابریتان، میتوانید از دستور firestore:delete در رابط خط فرمان (CLI) فایربیس استفاده کنید. میتوانید هر تابعی از رابط خط فرمان فایربیس را با استفاده از بسته firebase-tools به برنامه Node.js خود وارد کنید.
رابط خط فرمان فایربیس از رابط برنامهنویسی کاربردی REST Cloud Firestore برای یافتن تمام اسناد در مسیر مشخص شده و حذف تک تک آنها استفاده میکند. این پیادهسازی نیازی به دانش سلسله مراتب دادههای خاص برنامه شما ندارد و حتی اسناد «یتیم» را که دیگر والد ندارند، پیدا و حذف میکند.
نود جی اس
/** * 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
/** * 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 به طور یکپارچه به تابع راه دور منتقل میشوند. هنگامی که تابع تکمیل میشود، کلاینت یک فراخوانی مجدد با نتیجه یا یک استثنا دریافت میکند. برای کسب اطلاعات در مورد نحوه فراخوانی یک تابع ابری از اندروید، اپل یا پلتفرم دیگر، مستندات را مطالعه کنید.
محدودیتها
راه حل نشان داده شده در بالا، حذف مجموعهها از یک تابع قابل فراخوانی را نشان میدهد، اما باید از محدودیتهای زیر آگاه باشید:
- ثبات - کد بالا اسناد را یکی یکی حذف میکند. اگر در حالی که عملیات حذف در حال انجام است، پرس و جو کنید، نتایج شما ممکن است حالت نیمه کامل را نشان دهد که در آن فقط برخی از اسناد هدف حذف میشوند. همچنین هیچ تضمینی وجود ندارد که عملیات حذف به طور یکنواخت موفق یا ناموفق باشند، بنابراین برای رسیدگی به موارد حذف جزئی آماده باشید.
- وقفهها - تابع بالا طوری پیکربندی شده است که حداکثر ۵۴۰ ثانیه قبل از اتمام زمان اجرا شود. کد حذف میتواند در بهترین حالت ۴۰۰۰ سند را در هر ثانیه حذف کند. اگر نیاز به حذف بیش از ۲،۰۰۰،۰۰۰ سند دارید، باید اجرای عملیات را روی سرور خودتان در نظر بگیرید تا دچار وقفه نشود. برای مثالی از نحوه حذف یک مجموعه از سرور خودتان، به حذف مجموعهها مراجعه کنید.
- حذف تعداد زیادی سند ممکن است باعث شود نمایشگر دادهها در کنسول Google Cloud به آرامی بارگیری شود یا خطای اتمام زمان نمایش داده شود.