Bu sayfada, verileri silmek için çağrılabilir Cloud Functions işlevinin nasıl kullanılacağı açıklanmaktadır. Bu işlevi dağıttıktan sonra, dokümanları ve koleksiyonları yinelemeli olarak silmek için doğrudan mobil uygulamanızdan veya web sitenizden çağırabilirsiniz. Örneğin, belirli kullanıcılara koleksiyonların tamamını silme olanağı vermek için bu çözümü kullanabilirsiniz.
Koleksiyonları silmenin diğer yolları için Verileri silme başlıklı makaleyi inceleyin.
Çözüm: Çağrılabilir Cloud Functions işleviyle veri silme
Kaynak sınırlaması olan bir mobil uygulamada koleksiyonların tamamını silmek aşağıdaki nedenlerden dolayı zor olabilir:
- Bir koleksiyonu atomik olarak silen bir işlem yoktur.
- Bir dokümanın silinmesi, alt koleksiyonlarındaki dokümanların silinmesine neden olmaz.
- Dokümanlarınızda dinamik alt koleksiyonlar varsa belirli bir yol için hangi verilerin silineceğini bilmek zor olabilir.
- 500'den fazla belgeden oluşan bir koleksiyonun silinmesi için birden fazla toplu yazma işlemi veya yüzlerce tekli silme işlemi gerekir.
- Birçok uygulamada, son kullanıcılara koleksiyonların tamamını silme izni vermek uygun değildir.
Neyse ki, koleksiyonların veya koleksiyon ağaçlarının tamamını güvenli ve verimli bir şekilde silmek için çağrılabilir bir Cloud Function yazabilirsiniz. Aşağıdaki Cloud Functions işlevi, çağrılabilir bir işlevi uygular. Bu işlev, yerel bir işlevde olduğu gibi doğrudan mobil uygulamanızdan veya web sitenizden çağrılabilir.
İşlevi dağıtmak ve demoyu denemek için örnek koda bakın.
Cloud Functions işlevi
Aşağıdaki Cloud Function, bir koleksiyonu ve tüm alt öğelerini siler.
Cloud Function'ınız için kendi yinelemeli silme mantığınızı uygulamak yerine, Firebase Komut Satırı Arayüzü'ndeki (KSA) firestore:delete
komutundan yararlanabilirsiniz. firebase-tools
paketini kullanarak Firebase CLI'nin herhangi bir işlevini Node.js uygulamanıza aktarabilirsiniz.
Firebase CLI, belirtilen yolun altındaki tüm dokümanları bulmak ve bunları ayrı ayrı silmek için Cloud Firestore REST API'yi kullanır. Bu uygulama, uygulamanızın belirli veri hiyerarşisi hakkında bilgi sahibi olmanızı gerektirmez ve artık üst öğesi olmayan "üst öğesiz" dokümanları bile bulup siler.
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 }; });
İstemci Çağırma
İşlevi çağırmak için Firebase SDK'sından işlevin referansını alın ve gerekli parametreleri iletin:
Web
/** * 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
/** * 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 // ... } }); }
Çağrılabilir Cloud Functions için istemci SDK'sını kullanarak kullanıcının kimlik doğrulama durumu ve path
parametresi, uzaktaki işleve sorunsuz bir şekilde iletilir.
İşlev tamamlandığında istemci, sonuç veya istisna içeren bir geri çağırma alır. Android, Apple veya başka bir platformdan bulut işlevi çağırma hakkında bilgi edinmek için belgeleri okuyun.
Sınırlamalar
Yukarıda gösterilen çözüm, koleksiyonların çağrılabilir bir işlevden silinmesini gösterir ancak aşağıdaki sınırlamaları göz önünde bulundurmanız gerekir:
- Tutarlılık: Yukarıdaki kod, belgeleri tek tek siler. Devam eden bir silme işlemi sırasında sorgu gönderirseniz sonuçlarınız, yalnızca bazı hedef dokümanların silindiği kısmen tamamlanmış bir durumu yansıtabilir. Silme işlemlerinin başarılı veya başarısız olacağı da garanti edilmez. Bu nedenle, kısmi silme işlemlerini yönetmeye hazır olun.
- Zaman aşımları: Yukarıdaki işlev, zaman aşımına uğramadan önce en fazla 540 saniye çalışacak şekilde yapılandırılmıştır. Silme kodu, en iyi durumda saniyede 4.000 belge silebilir. 2.000.000'dan fazla dokümanı silmeniz gerekiyorsa işlemin zaman aşımına uğramaması için kendi sunucunuzda çalıştırmayı düşünebilirsiniz. Koleksiyonu kendi sunucunuzdan silme örneği için Koleksiyonları silme başlıklı makaleyi inceleyin.
- Çok sayıda dokümanın silinmesi, Google Cloud Console'daki veri görüntüleyicinin yavaş yüklenmesine veya zaman aşımı hatası döndürmesine neden olabilir.