این صفحه نحوه استفاده از یک تابع Cloud قابل فراخوان برای حذف داده ها را توضیح می دهد. هنگامی که این عملکرد را اجرا کردید، می توانید مستقیماً از برنامه تلفن همراه یا وب سایت خود با آن تماس بگیرید تا اسناد و مجموعه ها را به صورت بازگشتی حذف کنید. برای مثال، میتوانید از این راهحل برای دادن قابلیت حذف کل مجموعهها به کاربران منتخب استفاده کنید.
برای سایر روشهای حذف مجموعهها، به حذف دادهها مراجعه کنید.
راه حل: داده ها را با یک تابع Cloud قابل فراخوانی حذف کنید
حذف کل مجموعه ها از یک برنامه تلفن همراه با منابع محدود ممکن است به دلایل زیر دشوار باشد:
- هیچ عملیاتی وجود ندارد که مجموعه ای را به صورت اتمی حذف کند.
- حذف یک سند، اسناد موجود در زیر مجموعه های آن را حذف نمی کند.
- اگر اسناد شما دارای مجموعههای فرعی پویا هستند، دانستن اینکه چه دادههایی را برای یک مسیر مشخص باید حذف کنید دشوار است.
- حذف مجموعه ای از بیش از 500 سند به چندین عملیات نوشتن دسته ای یا صدها حذف منفرد نیاز دارد.
- در بسیاری از برنامه ها، دادن مجوز به کاربران نهایی برای حذف کل مجموعه ها مناسب نیست.
خوشبختانه، شما می توانید یک Cloud Function قابل فراخوانی بنویسید تا حذف ایمن و کارآمد کل مجموعه ها یا درختان مجموعه را اجرا کنید. تابع Cloud زیر یک تابع قابل فراخوانی را پیاده سازی می کند که به این معنی است که می توان آن را مستقیماً از برنامه تلفن همراه یا وب سایت شما همانطور که برای یک عملکرد محلی فراخوانی می کنید، فراخوانی کرد.
برای استقرار تابع و امتحان نسخه نمایشی، کد نمونه را ببینید.
عملکرد ابری
تابع Cloud زیر مجموعه و همه فرزندان آن را حذف می کند.
به جای اجرای منطق حذف بازگشتی خود برای عملکرد ابری خود، می توانید از دستور firestore:delete
در رابط خط فرمان Firebase (CLI) استفاده کنید. با استفاده از بسته firebase-tools
می توانید هر تابعی از Firebase CLI را به برنامه Node.js خود وارد کنید.
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
هدف-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 ثانیه قبل از اتمام زمان اجرا شود. کد حذف در بهترین حالت می تواند 4000 سند در ثانیه را حذف کند. اگر نیاز به حذف بیش از 2,000,000 سند دارید، باید عملیات را روی سرور خود اجرا کنید تا زمان آن تمام نشود. برای مثالی از نحوه حذف مجموعه از سرور خود، به حذف مجموعه ها مراجعه کنید.
- حذف تعداد زیادی از اسناد ممکن است باعث شود نمایشگر داده در کنسول Google Cloud به کندی بارگیری شود یا خطای مهلت زمانی بازگردد.