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

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

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

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

Kaynakları sınırlı bir mobil uygulamadaki koleksiyonların tamamının silinmesinin uygulanması aşağıdaki nedenlerden dolayı zor olabilir:

  • Bir koleksiyonu atomik olarak silen bir işlem yoktur.
  • Bir belgenin silinmesi, alt koleksiyonlarındaki belgelerin silinmesine neden olmaz.
  • Belgelerinizde 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 fazla toplu yazma işlemi veya yüzlerce tekli silme işlemi gerektirir.
  • Pek çok uygulamada son kullanıcılara koleksiyonların tamamını silme izni vermek uygun değildir.

Neyse ki, tüm koleksiyonların veya koleksiyon ağaçlarının güvenli ve performanslı bir şekilde silinmesini sağlamak için çağrılabilir bir Bulut İşlevi yazabilirsiniz. Aşağıdaki Bulut İşlevi çağrılabilir bir işlevi uygular; bu, yerel bir işlevde olduğu 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ünde (CLI) firestore:delete komutunun avantajlarından yararlanabilirsiniz. Firebase CLI'nin herhangi bir işlevini firebase-tools paketini kullanarak 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'yi kullanır. Bu uygulama, uygulamanızın özel veri hiyerarşisi hakkında bilgi sahibi olmanızı gerektirmez ve hatta artık üst öğesi olmayan "artık" belgeleri 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ş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
    

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ın kullanılmasıyla, kullanıcıların kimlik doğrulama durumu ve path parametresi sorunsuz bir şekilde uzak işleve aktarılır. İşlev tamamlandığında istemci, sonucu veya istisnayı içeren bir geri arama alır. Android, Apple veya başka bir platformdan 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 silinmesini göstermektedir, 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 sorgulama 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 aynı şekilde başarılı veya başarısız olacağına dair bir garanti 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'dan 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 .