Gunakan tahap Bahasa pengolahan data (DML) update(...) dan delete(...) untuk membuat pipeline data yang dapat mengkueri dokumen, lalu menghapus atau mengubah data.
Persyaratan Edisi
Operasi yang dijelaskan di halaman ini memerlukan edisi Firestore Enterprise.
Sebelum memulai
Anda harus memahami cara mengkueri database dengan operasi Pipeline.
Memperbarui dokumen
Gunakan tahap DML update(...) untuk membuat pipeline data
yang dapat mengkueri dokumen, lalu menambahkan atau mengubah data.
Semua tahap DML harus berada di akhir pipeline.
Dokumen yang masuk ke tahap ini harus menyertakan kolom __name__ untuk mengidentifikasi dokumen mana yang akan diperbarui. Operasi akan gagal jika salah satu dokumen yang Anda coba perbarui tidak ada.
Misalnya, operasi berikut mengisi ulang perubahan model data ke semua dokumen dalam kelompok koleksi. Pipeline menambahkan kolom preferences.color ke semua dokumen dalam grup koleksi users yang tidak memiliki kolom tersebut.
Node.js
const snapshot = await db.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant(null).as("preferences.color")) .removeFields("color") .update() .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not snapshot = ( client.pipeline() .collection_group("users") .where(Not(Field.of("preferences.color").exists())) .add_fields(Constant.of(None).as_("preferences.color")) .remove_fields("color") .update() .execute() )
Java
Pipeline.Snapshot snapshot = firestore.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant((String) null).as("preferences.color")) .removeFields("color") .update() .execute().get();
Go
snapshot := client.Pipeline(). CollectionGroup("users"). Where(firestore.Not(firestore.FieldExists(firestore.FieldOf("preferences.color")))). AddFields(firestore.Selectables( firestore.ConstantOfNull().As("preferences.color"), )). RemoveFields(firestore.Fields("color")). Update(). Execute(ctx)
Menghapus dokumen
Gunakan tahap DML delete(...) stage untuk membuat pipeline data
yang dapat mengkueri dokumen, lalu menghapus data.
Untuk mencegah penghapusan massal yang tidak disengaja, pipeline yang berakhir di delete(...) harus menyertakan setidaknya satu tahap where(...).
Semua tahap DML harus berada di akhir pipeline.
Misalnya, pipeline 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)
Konsistensi
Operasi pipeline dengan tahap update(...) dan delete() tidak didukung dalam transaksi. Tahap DML berjalan di luar transaksi dengan perilaku berikut:
- Setiap dokumen diperbarui secara independen. Artinya, operasi tidak bersifat atomik di seluruh dokumen. Operasi akan gagal pada error pertama dan keberhasilan parsial mungkin terjadi.
- Tahap berikut didukung:
collection(...)collection_group(...)where(...)select(...)add_fields(...)remove_fields(...)let(...)sort(...)limit(...)offset(...)
- Tahap berikut tidak didukung:
aggregate(...)distinct(...)unnest(...)find_nearest(...)- Tahap multi-kueri seperti
union(...), gabungan, dan sub-kueri tidak diizinkan sebelum tahap DML.
Batasan
Perhatikan batasan berikut untuk tahap DML:
- Tahap DML harus menjadi tahap terakhir dalam definisi pipeline sebelum memanggil
.execute(). - Operasi pipeline dengan tahap
update(...)dandelete()tidak didukung dalam transaksi. - Jika tahap sebelum tahap DML menghasilkan beberapa dokumen dengan
__name__yang sama, setiap instance akan diproses. Untukupdate(...), artinya dokumen target yang sama mungkin diubah beberapa kali. Untukdelete(...), upaya berikutnya setelah yang pertama tidak akan ada operasi.