এই পৃষ্ঠাটিতে ডেটা মুছে ফেলার জন্য একটি কলযোগ্য ক্লাউড ফাংশন কীভাবে ব্যবহার করবেন তা বর্ণনা করা হয়েছে। একবার আপনি এই ফাংশনটি স্থাপন করলে, আপনি আপনার মোবাইল অ্যাপ বা ওয়েবসাইট থেকে সরাসরি এটিতে কল করে ডকুমেন্ট এবং সংগ্রহগুলি পুনরাবৃত্তিমূলকভাবে মুছে ফেলতে পারেন। উদাহরণস্বরূপ, আপনি এই সমাধানটি ব্যবহার করে নির্বাচিত ব্যবহারকারীদের সম্পূর্ণ সংগ্রহ মুছে ফেলার ক্ষমতা দিতে পারেন।
সংগ্রহ মুছে ফেলার অন্যান্য উপায়ের জন্য, ডেটা মুছে ফেলুন দেখুন।
সমাধান: একটি কলযোগ্য ক্লাউড ফাংশন ব্যবহার করে ডেটা মুছে ফেলুন
নিম্নলিখিত কারণে একটি রিসোর্স-সীমিত মোবাইল অ্যাপ থেকে সম্পূর্ণ সংগ্রহ মুছে ফেলা কঠিন হতে পারে:
- এমন কোনও অপারেশন নেই যা পারমাণবিকভাবে কোনও সংগ্রহ মুছে ফেলে।
- একটি নথি মুছে ফেললে তার উপ-সংগ্রহের নথিগুলি মুছে যায় না।
- যদি আপনার ডকুমেন্টগুলিতে গতিশীল উপ-সংগ্রহ থাকে, তাহলে নির্দিষ্ট পাথের জন্য কোন ডেটা মুছে ফেলতে হবে তা জানা কঠিন হতে পারে।
- ৫০০ টিরও বেশি নথির একটি সংগ্রহ মুছে ফেলার জন্য একাধিক ব্যাচড রাইট অপারেশন অথবা শত শত একক মুছে ফেলার প্রয়োজন হয়।
- অনেক অ্যাপে, ব্যবহারকারীদের সম্পূর্ণ সংগ্রহ মুছে ফেলার অনুমতি দেওয়া উপযুক্ত নয়।
সৌভাগ্যবশত, আপনি সম্পূর্ণ সংগ্রহ বা সংগ্রহ গাছের নিরাপদ এবং কার্যকরী মুছে ফেলার জন্য একটি কলযোগ্য ক্লাউড ফাংশন লিখতে পারেন। নীচের ক্লাউড ফাংশনটি একটি কলযোগ্য ফাংশন প্রয়োগ করে যার অর্থ এটি সরাসরি আপনার মোবাইল অ্যাপ বা ওয়েবসাইট থেকে কল করা যেতে পারে যেমন আপনি একটি স্থানীয় ফাংশনের জন্য করেন।
ফাংশনটি স্থাপন করতে এবং একটি ডেমো চেষ্টা করতে, নমুনা কোডটি দেখুন।
ক্লাউড ফাংশন
নিচের ক্লাউড ফাংশনটি একটি সংগ্রহ এবং এর সমস্ত ডিসেন্ডেন্ট মুছে ফেলে।
আপনার ক্লাউড ফাংশনের জন্য নিজস্ব রিকার্সিভ ডিলিট লজিক প্রয়োগ করার পরিবর্তে, আপনি Firebase কমান্ড লাইন ইন্টারফেস (CLI) এ firestore:delete কমান্ডের সুবিধা নিতে পারেন। আপনি firebase-tools প্যাকেজ ব্যবহার করে আপনার Node.js অ্যাপ্লিকেশনে Firebase CLI এর যেকোনো ফাংশন আমদানি করতে পারেন।
Firebase CLI নির্দিষ্ট পথের অধীনে থাকা সমস্ত নথি খুঁজে বের করতে এবং সেগুলিকে পৃথকভাবে মুছে ফেলার জন্য Cloud Firestore REST API ব্যবহার করে। এই বাস্তবায়নের জন্য আপনার অ্যাপের নির্দিষ্ট ডেটা শ্রেণিবিন্যাস সম্পর্কে কোনও জ্ঞানের প্রয়োজন নেই এবং এমনকি "অনাথ" নথিগুলি খুঁজে বের করে মুছে ফেলবে যার আর কোনও অভিভাবক নেই।
নোড.জেএস
/** * 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 প্যারামিটার নির্বিঘ্নে রিমোট ফাংশনে প্রেরণ করা হয়। ফাংশনটি সম্পন্ন হলে, ক্লায়েন্ট ফলাফল বা ব্যতিক্রম সহ একটি কলব্যাক পাবে। অ্যান্ড্রয়েড, অ্যাপল বা অন্য কোনও প্ল্যাটফর্ম থেকে ক্লাউড ফাংশন কীভাবে কল করবেন তা জানতে, ডকুমেন্টেশনটি পড়ুন।
সীমাবদ্ধতা
উপরে দেখানো সমাধানটি একটি কলযোগ্য ফাংশন থেকে সংগ্রহ মুছে ফেলার বিষয়টি প্রদর্শন করে, তবে আপনার নিম্নলিখিত সীমাবদ্ধতাগুলি সম্পর্কে সচেতন থাকা উচিত:
- ধারাবাহিকতা - উপরের কোডটি একবারে একটি করে ডকুমেন্ট মুছে ফেলে। যদি আপনি একটি চলমান ডিলিট অপারেশন চলাকালীন কোয়েরি করেন, তাহলে আপনার ফলাফলগুলি আংশিকভাবে সম্পূর্ণ অবস্থা প্রতিফলিত করতে পারে যেখানে শুধুমাত্র কিছু লক্ষ্যযুক্ত ডকুমেন্ট মুছে ফেলা হয়। ডিলিট অপারেশনগুলি সমানভাবে সফল বা ব্যর্থ হবে এমন কোনও গ্যারান্টি নেই, তাই আংশিক ডিলিটের ক্ষেত্রে পরিচালনা করার জন্য প্রস্তুত থাকুন।
- টাইমআউট - উপরের ফাংশনটি টাইমআউট হওয়ার আগে সর্বোচ্চ 540 সেকেন্ড চালানোর জন্য কনফিগার করা হয়েছে। ডিলিটেশন কোডটি সর্বোত্তম ক্ষেত্রে প্রতি সেকেন্ডে 4000টি ডকুমেন্ট মুছে ফেলতে পারে। যদি আপনার 2,000,000টিরও বেশি ডকুমেন্ট মুছে ফেলার প্রয়োজন হয়, তাহলে আপনার নিজের সার্ভারে অপারেশনটি চালানোর কথা বিবেচনা করা উচিত যাতে এটি টাইমআউট না হয়। আপনার নিজের সার্ভার থেকে কীভাবে একটি সংগ্রহ মুছে ফেলবেন তার একটি উদাহরণের জন্য, ডিলিট কালেকশন দেখুন।
- প্রচুর সংখ্যক ডকুমেন্ট মুছে ফেলার ফলে গুগল ক্লাউড কনসোলে ডেটা ভিউয়ার ধীরে ধীরে লোড হতে পারে অথবা টাইমআউট ত্রুটি দেখা দিতে পারে।