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. Untukupdate(...), hal ini berarti dokumen target yang sama mungkin diubah beberapa kali. Untukdelete(...), upaya berikutnya setelah yang pertama tidak akan ada operasi.