RTDB có thể thực hiện việc này vì mỗi cơ sở dữ liệu là cục bộ cho một vùng duy nhất. Để cung cấp chế độ xem được tuần tự hóa, khi bạn gọi remove()
, cơ sở dữ liệu sẽ dừng tất cả công việc khác cho đến khi việc xóa hoàn tất.
Hành vi này đã là nguyên nhân của một số mất điện rõ ràng: nếu cuộc gọi remove()
phải xóa dữ liệu khổng lồ, tất cả hoạt động khác sẽ bị khóa hiệu quả cho đến khi hoàn thành. Kết quả là ngay cả đối với những người dùng RTDB muốn xóa một lượng lớn dữ liệu, chúng tôi đã đề nghị đệ quy tìm và xóa tài liệu theo nhóm. Mặt khác, Firestore dựa trên cơ sở hạ tầng lưu trữ theo phong cách truyền thống của Google, nơi các phạm vi khóa khác nhau được gán dynamically to different servers (bộ nhớ không thực sự được BigTable hỗ trợ, nhưng cũng áp dụng các nguyên tắc tương tự). Điều này có nghĩa rằng việc xóa dữ liệu không còn là một hành động đơn lẻ nhất định và nó trở nên rất tốn kém để thực hiện việc xóa một cách hiệu quả giao dịch. Các giao dịch Firestore hiện bị giới hạn ở 100 người tham gia và điều này có nghĩa là bất kỳ việc xóa hàng loạt giao dịch không tầm thường nào là không thể.
Chúng tôi đang điều tra cách tốt nhất để hiển thị API thực hiện xóa hàng loạt mà không có hành vi giao dịch đầy hứa hẹn. Thật đơn giản để tưởng tượng làm thế nào để làm điều này từ một khách hàng điện thoại di động, nhưng như bạn đã quan sát thấy điều này sẽ không hiệu quả nếu tất cả những gì chúng tôi làm là nhúng vòng lặp và xóa hàng loạt cho bạn. Chúng tôi cũng không muốn làm cho khách hàng REST trở thành công dân hạng hai.
Firestore là sản phẩm mới và vẫn còn nhiều việc phải làm. Thật không may điều này chỉ không thực hiện việc cắt giảm. Mặc dù đây là điều chúng tôi hy vọng sẽ giải quyết cuối cùng nhưng tôi không thể cung cấp bất kỳ thời gian nào về thời điểm đó.
Trong khi chờ đợi, bảng điều khiển và firebase command-line đều cung cấp phương tiện không giao dịch để thực hiện việc này, ví dụ: để tự động hóa thử nghiệm.
Cảm ơn sự thông cảm của bạn và cảm ơn bạn vì đã thử Firestore!
Nguồn
2017-10-11 20:40:38
Tôi nghĩ rằng ví dụ trong tài liệu Firestore (được liên kết bởi @toofoo trong câu hỏi) là không chính xác. ´resolve() ´ nên được gọi khi ´ (numDeleted == 0) ´. – Leo
BTW, tải lên hiện tại có được thực hiện theo lô không? Hoặc các giao dịch có thể được sử dụng? – Leo
Và một câu hỏi khác. Bạn đã viết "xóa hàng loạt mà không có hành vi giao dịch đầy hứa hẹn". Tôi cần hành vi giao dịch. Tôi có thể hy vọng điều đó không? – Leo