Xoá

delete() là một giai đoạn Ngôn ngữ thao tác dữ liệu (DML) cho phép một truy vấn xoá các tài liệu dựa trên kết quả của một truy vấn. Giai đoạn này có thể được đính kèm vào cuối một truy vấn và sẽ xoá tất cả các tài liệu mà trường __name__ từ giai đoạn trước tham chiếu.

Ví dụ

Ví dụ: truy vấn sau đây sẽ xoá tất cả các tài liệu usersaddress.users được đặt thành USA và có __create_time__ dưới 10 ngày:

Node.js
const pipeline = db.pipeline()
  .collectionGroup("users")
  .where(field("address.country").equal("USA"))
  .where(field("__create_time__").timestampAdd("day", 10).lessThan(currentTimestamp()))
  .delete();
await pipeline.execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import CurrentTimestamp, Field

snapshot = (
    client.pipeline()
    .collection_group("users")
    .where(Field.of("address.country").equal("USA"))
    .where(
        Field.of("__create_time__")
        .timestamp_add("day", 10)
        .less_than(CurrentTimestamp())
    )
    .delete()
    .execute()
)
Java
Pipeline.Snapshot deleteResults = firestore.pipeline()
  .collectionGroup("users")
  .where(field("address.country").equal("USA"))
  .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp()))
  .delete()
  .execute().get();
Bắt đầu
snapshot := client.Pipeline().
	CollectionGroup("users").
	Where(firestore.FieldOf("address.country").Equal("USA")).
	Where(firestore.FieldOf("__create_time__").Add(firestore.ConstantOf(10)).LessThan(firestore.CurrentTimestamp())).
	Delete().
	Execute(ctx)

Hành vi

Phản hồi

Giai đoạn delete() luôn phát ra một tài liệu duy nhất như { documents_modified: 28L } mô tả số lượng tài liệu đã bị xoá.

Xoá hoàn toàn bộ sưu tập

Bạn có thể xoá tất cả tài liệu khỏi một bộ sưu tập bằng cách thêm delete() vào giai đoạn đầu vào, chẳng hạn như:

Node.js

const results = await db.pipeline()
  .collection("/users")
  .delete()
  .execute();

Đảm bảo giai đoạn where(...) trước delete() cuối cùng giới hạn đúng cách các tài liệu chỉ cập nhật những tài liệu dự kiến. Bạn nên chạy truy vấn mà không có giai đoạn delete() cuối cùng trước để xác thực rằng chỉ những tài liệu dự kiến mới bị xoá.

Giai đoạn cuối

Giai đoạn delete() phải nằm ở cuối quy trình, không thể cung cấp thêm giai đoạn nào khác.

Xoá tất cả

Theo mặc định, giai đoạn delete() sẽ xoá tất cả tài liệu mà giai đoạn trước đó tham chiếu. Nếu bạn muốn giới hạn kích thước của khối lượng công việc hoặc biết rằng các điều kiện lọc khớp chính xác với một tài liệu, thì bạn có thể thêm limit(1) trước delete() cuối cùng để giới hạn tổng khối lượng công việc.

Cross Collection Mutations

Giai đoạn delete() cuối cùng sẽ áp dụng các đột biến cho bất kỳ tài liệu nào được tham chiếu bởi __name__ (giả sử bạn đã cung cấp tất cả thông tin xác thực cần thiết). Thao tác này bao gồm việc xoá các tài liệu khỏi nhiều bộ sưu tập hoặc nhóm bộ sưu tập khác nhau trong cùng một yêu cầu.

__name__ Bắt buộc

Giai đoạn delete() yêu cầu giai đoạn trước đó cung cấp một trường __name__ chứa một tài liệu tham chiếu cần xoá. Nếu không làm như vậy, bạn sẽ gặp phải lỗi thời gian chạy và khi chạy bên ngoài một giao dịch, bạn có thể gặp phải trường hợp thành công một phần.

Hầu hết các giai đoạn Đầu vào, chẳng hạn như collection(...), collection_group(...), database(...)documents(...), đều bao gồm trường __name__ theo mặc định, vì vậy, điều này chỉ phù hợp nếu bạn đang sử dụng một phép chiếu (chẳng hạn như select(...)) hoặc thực hiện một phép biến đổi trên các tài liệu (chẳng hạn như aggregate(...)).

Phản hồi này bao gồm thông tin tóm tắt về số lượng tài liệu đã được sửa đổi. Ví dụ: phản hồi sau đây xác nhận rằng quy trình đã sửa đổi 3 tài liệu:

{documents_modified: 3L}

Hạn chế

  • Các giai đoạn DML không hỗ trợ Cloud Firestore Security Rules. Các thao tác DML thông qua Cloud Firestore Security Rules sẽ bị từ chối.

  • Trong giai đoạn Xem trước của tính năng này, bạn không thể chạy các giai đoạn DML trong một giao dịch. Để biết thêm thông tin về hành vi nhất quán, hãy xem phần Tính nhất quán.

  • Nếu giai đoạn trước giai đoạn DML tạo ra nhiều tài liệu có cùng __name__, thì mỗi phiên bản sẽ được xử lý. Đối với update(...), điều này có nghĩa là cùng một tài liệu đích có thể được sửa đổi nhiều lần. Đối với delete(...), các lần thử tiếp theo sau lần đầu tiên sẽ không hoạt động.