Hapus

delete() adalah stage Bahasa pengolahan data (DML) yang memungkinkan kueri menghapus dokumen berdasarkan hasil kueri. Tahap ini dapat dilampirkan ke akhir kueri dan akan menghapus semua dokumen yang direferensikan oleh kolom __name__ dari tahap sebelumnya.

Contoh

Misalnya, kueri berikut menghapus semua users dokumen dengan address.users yang ditetapkan ke USA dan dengan __create_time__ kurang dari 10 hari:

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();
Go
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)

Perilaku

Respons

Tahap delete() selalu menampilkan satu dokumen seperti { documents_modified: 28L } yang menjelaskan jumlah dokumen yang dihapus.

Penghapusan Koleksi Penuh

Menghapus semua dokumen dari koleksi dapat dilakukan dengan menambahkan delete() ke tahap input seperti:

Node.js

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

Pastikan tahap where(...) sebelum delete() terakhir membatasi dokumen dengan benar sehingga hanya dokumen yang diharapkan yang diperbarui. Sebaiknya jalankan kueri tanpa tahap delete() terakhir terlebih dahulu untuk memvalidasi bahwa hanya dokumen yang dimaksud yang dihapus.

Tahap Akhir

Tahap delete() harus berada di akhir pipeline, tidak ada tahap lebih lanjut yang dapat diberikan.

Hapus Semua

Secara default, tahap delete() akan menghapus semua dokumen yang direferensikan oleh tahap sebelumnya. Jika Anda ingin membatasi ukuran workload, atau Anda tahu bahwa kondisi filter cocok dengan tepat satu dokumen, limit(1) dapat ditambahkan sebelum delete() terakhir untuk membatasi total pekerjaan.

Mutasi Koleksi Silang

Tahap delete() terakhir akan menerapkan mutasi ke dokumen apa pun yang direferensikan oleh __name__ (dengan asumsi semua autentikasi yang diperlukan telah diberikan). Hal ini mencakup penghapusan dokumen dari beberapa koleksi atau grup koleksi yang berbeda sebagai bagian dari permintaan yang sama.

__name__ Diperlukan

Tahap delete() mengharuskan tahap sebelumnya menyediakan kolom __name__ yang berisi referensi dokumen untuk dihapus. Jika tidak dilakukan, error runtime akan terjadi, dan jika dijalankan di luar transaksi, keberhasilan sebagian dapat terjadi.

Sebagian besar tahap Input, seperti collection(...), collection_group(...), database(...), dan documents(...), menyertakan kolom __name__ secara default sehingga hal ini hanya relevan jika menggunakan proyeksi (seperti select(...)) atau melakukan transformasi pada dokumen (seperti aggregate(...)).

Respons mencakup ringkasan jumlah dokumen yang diubah. Misalnya, respons berikut mengonfirmasi bahwa pipeline mengubah tiga dokumen:

{documents_modified: 3L}

Batasan

  • Tahap DML tidak mendukung Cloud Firestore Security Rules. Upaya operasi DML melalui Cloud Firestore Security Rules ditolak.

  • Selama Pratinjau untuk fitur ini, Anda tidak dapat menjalankan tahap DML dalam transaksi. Untuk mengetahui informasi selengkapnya tentang perilaku konsistensi, lihat Konsistensi.

  • Jika tahap sebelum tahap DML menghasilkan beberapa dokumen dengan __name__ yang sama, setiap instance akan diproses. Untuk update(...), hal ini berarti dokumen target yang sama mungkin diubah beberapa kali. Untuk delete(...), upaya berikutnya setelah yang pertama tidak akan ada operasi.