Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Çağrılabilir Bulut İşlevi ile verileri silin

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Sayfa, verileri silmek için çağrılabilir bir Bulut İşlevinin nasıl kullanılacağını açıklar. Bu işlevi dağıttıktan sonra, belgeleri ve koleksiyonları yinelemeli olarak silmek için doğrudan mobil uygulamanızdan veya web sitenizden arayabilirsiniz. Örneğin, belirli kullanıcılara tüm koleksiyonları silme yeteneği vermek için bu çözümü kullanabilirsiniz.

Koleksiyonları silmenin diğer yolları için bkz. Verileri silme .

Çözüm: Çağrılabilir bir Bulut İşlevi ile verileri silin

Kaynakla sınırlı bir mobil uygulamadan koleksiyonların tamamını silmek, aşağıdaki nedenlerden dolayı zor olabilir:

  • Bir koleksiyonu atomik olarak silen bir işlem yoktur.
  • Bir belgenin silinmesi, alt koleksiyonlarındaki belgeleri silmez.
  • Belgelerinizin 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, birden çok toplu yazma işlemi veya yüzlerce tek silme işlemi gerektirir.
  • Birçok uygulamada, son kullanıcılara tüm koleksiyonları silme izni vermek uygun değildir.

Neyse ki, tüm koleksiyonların veya koleksiyon ağaçlarının güvenli ve performanslı silme işlemlerini gerçekleştirmek için çağrılabilir bir Bulut İşlevi yazabilirsiniz. Aşağıdaki Bulut İşlevi, çağrılabilir bir işlev uygular; bu, yerel bir işlev için yaptığınız gibi doğrudan mobil uygulamanızdan veya web sitenizden çağrılabileceği anlamına gelir.

İşlevi dağıtmak ve bir demo denemek için örnek koda bakın.

Bulut İşlevi

Aşağıdaki Bulut İşlevi, bir koleksiyonu ve onun tüm alt öğelerini siler.

Bulut İşleviniz için kendi yinelemeli silme mantığınızı uygulamak yerine, Firebase Komut Satırı Arayüzündeki (CLI) firestore:delete komutundan yararlanabilirsiniz. firebase-tools paketini kullanarak Firebase CLI'nin herhangi bir işlevini Node.js uygulamanıza aktarabilirsiniz.

Firebase CLI, belirtilen yol altındaki tüm belgeleri bulmak ve tek tek silmek için Cloud Firestore REST API'yi kullanır. Bu uygulama, uygulamanızın belirli veri hiyerarşisi hakkında bilgi gerektirmez ve hatta artık bir üst öğesi olmayan "artık" belgeleri 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ğrısı

İşlevi çağırmak için Firebase SDK'sından işleve bir başvuru alın ve gerekli parametreleri iletin:

/**
 * 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);
        });
}
Süratli
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
    // Snippet not yet written
    
Amaç-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
    // 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
                    // ...
                }
            });
}

Çağrılabilir bulut işlevleri için istemci SDK'sını kullanarak, kullanıcıların kimlik doğrulama durumu ve path parametresi sorunsuz bir şekilde uzak işleve iletilir. İşlev tamamlandığında, müşteri sonuç veya istisna içeren bir geri arama alır. Android, Apple veya başka bir platformdan bir bulut işlevinin nasıl çağrılacağını öğrenmek için belgeleri okuyun.

sınırlamalar

Yukarıda gösterilen çözüm, koleksiyonların çağrılabilir bir işlevden silindiğini gösterir, ancak aşağıdaki sınırlamaların farkında olmalısınız:

  • Tutarlılık - yukarıdaki kod belgeleri birer birer siler. Devam eden bir silme işlemi varken sorgularsanız, sonuçlarınız yalnızca bazı hedeflenen belgelerin silindiği kısmen tamamlanmış bir durumu yansıtabilir. Silme işlemlerinin aynı şekilde başarılı veya başarısız olacağına dair bir garanti de yoktur, bu nedenle kısmi silme durumlarını ele almaya hazırlıklı olun.
  • Zaman aşımları - yukarıdaki işlev, zaman aşımına uğramadan önce maksimum 540 saniye çalışacak şekilde yapılandırılmıştır. Silme kodu, en iyi durumda saniyede 4000 belgeyi silebilir. 2.000.000'den fazla belgeyi silmeniz gerekiyorsa, zaman aşımına uğramaması için işlemi kendi sunucunuzda çalıştırmayı düşünmelisiniz. Bir koleksiyonun kendi sunucunuzdan nasıl silineceğine ilişkin bir örnek için bkz. Koleksiyonları silme .