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

Sayfada, çağrılabilir bir Cloud Functions işlevinin nasıl kullanılacağı açıklanır. tıklayın. Bu işlevi dağıttıktan sonra doğrudan mobil uygulamanızdan veya web sitenizden telefon ederek Dokümanları ve koleksiyonları yinelemeli olarak silme. Örneğin, şunu kullanabilirsiniz: belirli kullanıcılara koleksiyonların tamamını silme olanağı tanıyan bir çözümümüz var.

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ı silmek zor olabilir. aşağıdaki nedenlerle uygulayabilirsiniz:

  • Koleksiyonları atomik olarak silen bir işlem yoktur.
  • Bir dokümanı sildiğinizde, alt koleksiyonlarındaki dokümanlar silinmez.
  • Dokümanlarınızda dinamik alt koleksiyonlar varsa hangi öğelerin belirli bir yol için silinecek veriler
  • 500'den fazla doküman içeren bir koleksiyonu silmek için birden çok doküman gereklidir veya yüzlerce tek silme işlemi gerçekleştirebilirsiniz.
  • Birçok uygulamada, son kullanıcılara silme izni vermek uygun değildir koleksiyonun tamamını kullanabilirsiniz.

Neyse ki çağrılanabilir bir Cloud Functions işlevi yazabilirsiniz. . Aşağıdaki Cloud Functions işlevi, bir çağrılanabilir işlev uygular Bu da sizi doğrudan mobil uygulamanızdan veya web sitenizden diğeri ise yerel bir işlevdir.

İş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 firestore:delete komutundan yararlanabilirsiniz. Firebase Komut Satırı Arayüzü (KSA). Firebase CLI'ı, firebase-tools paketini kullanarak Node.js uygulamanıza bağlayın.

Firebase CLI, Cloud Firestore REST API'yi kullanır belirtilen yoldaki tüm belgeleri bulup tek tek silebilirsiniz. Bu uygulama, uygulamanızın özel veri hiyerarşisi hakkında bilgi gerektirmez ve hatta "artık" bulunan öğeleri bulup siler artık böyle bir belgeye sahip olmayan üst öğesidir.

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ındaki işleve 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 durum ve path parametresi, uzak işleve sorunsuz bir şekilde aktarılır. İşlev tamamlandığında, müşteri bir istisna oluşturur. Şuradan Cloud Functions işlevini nasıl çağıracağınızı öğrenmek için: Android, Apple veya başka bir platform için dokümanları okuyun.

Sınırlamalar

Yukarıda gösterilen çözüm, çağrılabilen bir cihazdan koleksiyonların silinmesini göstermektedir ancak aşağıdaki sınırlamaların farkında olmanız gerekir:

  • Tutarlılık: Yukarıdaki kod, dokümanları tek tek siler. Şu durumda: işlemi devam ederken bir silme işlemi söz konusuysa sonuçlarınız yalnızca bazı hedeflenen dokümanların silindiği kısmen tamamlanmış bir durum. Ayrıca, silme işlemlerinin başarılı olacağının veya eşit şekilde başarısız olduğundan, kısmi silme durumlarını ele almaya hazırlıklı olun.
  • Zaman aşımı sayısı: Yukarıdaki işlev en fazla 540 gün boyunca çalışacak şekilde yapılandırılmıştır saniye sonra zaman aşımına uğramadan önce Silme kodu ile 4000 silinebilir en iyi durumda saniyede doküman sayısı. Fotoğraftan daha fazlasını silmeniz gerekiyorsa 2.000.000 doküman varsa işlemi kendi başınıza çalıştırmayı göz önünde bulundurmalısınız. zaman aşımına uğramaması için sunucu ayarını kontrol edin. Örnek olarak, Koleksiyonları silme başlıklı makaleyi inceleyin.