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

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 Verileri silme konusuna bakın.

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

Kaynak sınırlı bir mobil uygulamadan tüm koleksiyonları silmek, aşağıdaki nedenlerden dolayı uygulanması 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ı silmelerini çalıştırmak için çağrılabilir bir Bulut İşlevi yazabilirsiniz. Aşağıdaki Bulut İşlevi, yerel bir işlevde olduğu gibi doğrudan mobil uygulamanızdan veya web sitenizden çağrılabileceği anlamına gelen çağrılabilir bir işlev uygular.

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

Bulut İşlevi

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

Bulut İşleviniz için kendi özyinelemeli 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 bunları tek tek silmek için Cloud Firestore REST API'sini kullanır. Bu uygulama, uygulamanızın belirli veri hiyerarşisi hakkında bilgi gerektirmez ve artık bir üst öğesi olmayan "artık" belgeleri bile bulur ve 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,
        yes: true,
        token: functions.config().fb.token
      });

    return {
      path: path 
    };
  });

İstemci Çağırma

İşlevi çağırmak için Firebase SDK'sından işleve bir referans 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
    

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
                    // ...
                }
            });
}

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
                // ...
            }
}

Ç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 geçirilir. İşlev tamamlandığında, istemci sonuç veya istisna içeren bir geri arama alacaktı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, çağrılabilir bir işlevden koleksiyonların silinmesini 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 sorgu yaparsanız, sonuçlarınız yalnızca hedeflenen bazı belgelerin silindiği kısmen tamamlanmış bir durumu yansıtabilir. Ayrıca silme işlemlerinin tek tip olarak başarılı veya başarısız olacağının garantisi yoktur, bu nedenle kısmi silme durumlarını ele almaya hazır 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, işlemin zaman aşımına uğramaması için işlemi kendi sunucunuzda çalıştırmayı düşünmelisiniz. Kendi sunucunuzdan bir koleksiyonu nasıl sileceğinize ilişkin bir örnek için Koleksiyonları silme konusuna bakın.