Ç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ı silmeyle ilgili diğer yöntemler için Verileri silme başlıklı makaleyi inceleyin.

Çözüm: Çağrılabilir Cloud Functions işleviyle veri silme

Kaynakları sınırlı olan bir mobil uygulamadaki koleksiyonların tamamını silmek aşağıdaki nedenlerle zor olabilir:

  • Koleksiyonları temel 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ılabilir bir Cloud Function 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 demoyu denemek için örnek koda bakın.

Cloud Functions işlevi

Aşağıdaki Cloud 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'nin herhangi bir işlevini Node.js uygulamanıza aktarabilirsiniz.

Firebase CLI, belirtilen yol altındaki tüm dokümanları bulup tek tek silmek için Cloud Firestore REST API'sini kullanır. Bu uygulama için uygulamanızın veri hiyerarşisi hakkında bilgi sahibi olmanız gerekmez. Hatta artık üst öğesi olmayan "öksüz" dokümanları bulup silebilir.

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ç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, sonucu veya bir istisnayı içeren bir geri çağırma alır. Android, Apple veya başka bir platformdan Cloud Functions 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. Silme işlemlerinin her zaman başarılı veya başarısız olacağı da garanti edilmez. Bu nedenle, kısmi silme durumlarıyla başa çıkmaya hazır 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. Silme kodu, en iyi durumda saniyede 4.000 doküman silebilir. 2.000.000'den fazla belgeyi silmeniz gerekiyorsa zaman aşımı olmaması için işlemi kendi sunucunuzda çalıştırabilirsiniz. Bir koleksiyonu kendi sunucunuzdan nasıl sileceğiniz hakkında örnek için Koleksiyonları silme bölümüne bakın.
  • Çok sayıda belgeyi silmek, Google Cloud Console'daki veri görüntüleyicinin yavaş yüklenmesine veya zaman aşımı hatası döndürmesine neden olabilir.