Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Xóa dữ liệu bằng Chức năng đám mây có thể gọi

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Trang mô tả cách sử dụng Chức năng đám mây có thể gọi được để xóa dữ liệu. Khi bạn triển khai chức năng này, bạn có thể gọi nó trực tiếp từ ứng dụng di động hoặc trang web của mình để xóa tài liệu và bộ sưu tập theo cách đệ quy. Ví dụ: bạn có thể sử dụng giải pháp này để cung cấp cho người dùng được chọn khả năng xóa toàn bộ bộ sưu tập.

Để biết các cách khác để xóa bộ sưu tập, hãy xem Xóa dữ liệu .

Giải pháp: Xóa dữ liệu bằng Chức năng đám mây có thể gọi được

Có thể khó thực hiện xóa toàn bộ bộ sưu tập khỏi ứng dụng dành cho thiết bị di động bị giới hạn tài nguyên vì những lý do sau:

  • Không có thao tác nào xóa nguyên bộ sưu tập.
  • Xóa tài liệu không xóa tài liệu trong bộ sưu tập con của nó.
  • Nếu tài liệu của bạn có các bộ sưu tập con động, có thể khó biết dữ liệu nào cần xóa cho một đường dẫn nhất định.
  • Việc xóa một bộ sưu tập hơn 500 tài liệu yêu cầu nhiều thao tác ghi hàng loạt hoặc hàng trăm lần xóa đơn lẻ.
  • Trong nhiều ứng dụng, việc cấp cho người dùng cuối quyền xóa toàn bộ bộ sưu tập là không phù hợp.

May mắn thay, bạn có thể viết một Hàm đám mây có thể gọi được để chạy các thao tác xóa toàn bộ bộ sưu tập hoặc cây bộ sưu tập một cách an toàn và hiệu quả. Hàm đám mây bên dưới triển khai một hàm có thể gọi được, nghĩa là nó có thể được gọi trực tiếp từ ứng dụng hoặc trang web dành cho thiết bị di động của bạn giống như cách bạn thực hiện đối với một hàm cục bộ.

Để triển khai hàm và dùng thử bản trình diễn, hãy xem mã mẫu .

Chức năng đám mây

Chức năng Đám mây bên dưới sẽ xóa một bộ sưu tập và tất cả các phần tử con của nó.

Thay vì triển khai logic xóa đệ quy của riêng bạn cho Chức năng đám mây, bạn có thể tận dụng lệnh firestore:delete trong Giao diện dòng lệnh Firebase (CLI). Bạn có thể nhập bất kỳ chức năng nào của Firebase CLI vào ứng dụng Node.js của mình bằng gói firebase-tools .

Firebase CLI sử dụng API REST của Cloud Firestore để tìm tất cả các tài liệu theo đường dẫn đã chỉ định và xóa chúng riêng lẻ. Việc triển khai này không yêu cầu kiến ​​thức về hệ thống phân cấp dữ liệu cụ thể của ứng dụng của bạn và thậm chí sẽ tìm và xóa các tài liệu "mồ côi" không còn tài liệu gốc.

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

Yêu cầu khách hàng

Để gọi hàm, hãy lấy tham chiếu đến hàm từ SDK Firebase và chuyển các tham số bắt buộc:

mạng
/**
 * 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);
        });
}
Nhanh
Lưu ý: Sản phẩm này không khả dụng trên các mục tiêu watchOS và App Clip.
    // Snippet not yet written
    
Mục tiêu-C
Lưu ý: Sản phẩm này không khả dụng trên các mục tiêu watchOS và App Clip.
    // 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
                    // ...
                }
            });
}

Bằng cách sử dụng SDK máy khách cho các chức năng đám mây có thể gọi được, trạng thái xác thực của người dùng và tham số path được chuyển liền mạch đến chức năng từ xa. Khi chức năng hoàn thành, khách hàng sẽ nhận được một cuộc gọi lại với kết quả hoặc một ngoại lệ. Để tìm hiểu về cách gọi chức năng đám mây từ Android, Apple hoặc nền tảng khác, hãy đọc tài liệu .

Hạn chế

Giải pháp hiển thị ở trên minh họa việc xóa các bộ sưu tập khỏi một chức năng có thể gọi được, nhưng bạn nên lưu ý những hạn chế sau:

  • Tính nhất quán - đoạn mã trên xóa từng tài liệu một. Nếu bạn truy vấn trong khi thao tác xóa đang diễn ra, kết quả của bạn có thể phản ánh trạng thái hoàn thành một phần trong đó chỉ một số tài liệu được nhắm mục tiêu bị xóa. Cũng không có gì đảm bảo rằng các thao tác xóa sẽ thành công hay thất bại một cách thống nhất, vì vậy hãy sẵn sàng xử lý các trường hợp xóa một phần.
  • Hết giờ - chức năng trên được định cấu hình để chạy tối đa 540 giây trước khi hết thời gian chờ. Mã xóa có thể xóa 4000 tài liệu mỗi giây trong trường hợp tốt nhất. Nếu bạn cần xóa hơn 2.000.000 tài liệu, bạn nên cân nhắc chạy thao tác trên máy chủ của riêng mình để không bị hết thời gian chờ. Để biết ví dụ về cách xóa bộ sưu tập khỏi máy chủ của riêng bạn, hãy xem Xóa bộ sưu tập .