Çağrılanabilir Cloud Functions işleviyle verileri silme

Sayfada, verileri silmek için çağrılabilir bir Cloud Functions işlevinin nasıl kullanılacağı açıklanmaktadır. Bu işlevi dağıttıktan sonra, dokümanları ve koleksiyonları sürekli olarak silmek için işlevi 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 bir Cloud Functions işleviyle verileri silin

Kaynak sınırlı bir mobil uygulamadan koleksiyonların tamamını silme işlemi aşağıdaki nedenlerden dolayı zor olabilir:

  • Koleksiyonları atomik olarak silen bir işlem yoktur.
  • Bir dokümanı sildiğinizde, alt koleksiyonlarındaki dokümanlar silinmez.
  • 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 için birden fazla toplu yazma işlemi veya yüzlerce tek 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 yüksek performanslı bir şekilde silmek için çağrılanabilir bir Cloud Functions işlevi yazabilirsiniz. Aşağıdaki Cloud Functions işlevi bir çağrılanabilir işlev uygular. Bu işlev, yerel bir işlevde 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 kodu inceleyin.

Cloud Functions işlevi

Aşağıdaki Cloud Functions işlevi, bir koleksiyonu ve tüm alt öğelerini siler.

Cloud Functions iş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'ın herhangi bir işlevini Node.js uygulamanıza aktarabilirsiniz.

Firebase CLI, belirtilen yoldaki tüm belgeleri bulmak ve 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 olmayı gerektirmez ve artık üst öğesi olmayan "artık" dokümanları 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 referans 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
Not: Bu ürün, watchOS ve App Clip hedeflerinde kullanılamaz.
    // Snippet not yet written
    
Objective-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde kullanılamaz.
    // 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 Cloud Functions işlevleri için istemci SDK'sı kullanıldığında, kullanıcıların kimlik doğrulama durumu ve path parametresi, uzak işleve sorunsuz bir şekilde aktarılır. İşlev tamamlandığında, istemci sonuç veya istisna içeren bir geri çağırma alır. Android, Apple veya başka bir platformdan bulut işlevini nasıl çağıracağınızı öğrenmek için belgeleri okuyun.

Sınırlamalar

Yukarıda gösterilen çözüm, çağrılabilir bir işlevden koleksiyonların silindiğini göstermektedir ancak aşağıdaki sınırlamalara dikkat etmelisiniz:

  • Tutarlılık: Yukarıdaki kod, dokümanları tek tek siler. Devam eden bir silme işlemi varken sorgu yaparsanız sonuçlarınız yalnızca hedeflenen dokümanların silindiği kısmen tamamlanmış bir durumu yansıtabilir. Ayrıca silme işlemlerinin 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şımı: Yukarıdaki işlev, zaman aşımına uğramadan önce maksimum 540 saniye boyunca çalışacak şekilde yapılandırılmıştır. En iyi durumda silme kodu, saniyede 4.000 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ı göz önünde bulundurmalısınız. Bir koleksiyonu kendi sunucunuzdan nasıl sileceğinize ilişkin bir örnek için Koleksiyonları silme bölümüne bakın.