Mengubah data dengan operasi Pipeline
Gunakan tahap Bahasa pengolahan data (DML) update(...) dan delete(...) untuk membuat pipeline data yang dapat membuat kueri dokumen, lalu menghapus atau mengubah data.
Persyaratan Edisi
Operasi yang dijelaskan di halaman ini memerlukan edisi Firestore Enterprise.
Sebelum memulai
Anda harus memahami cara membuat kueri database dengan operasi Pipeline.
Memperbarui dokumen
Gunakan tahap DML update(...) untuk membuat pipeline data
yang dapat membuat kueri untuk 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 update tidak ada.
Misalnya,
operasi berikut mengisi ulang perubahan model data ke semua dokumen dalam
grup 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();
Menghapus dokumen
Gunakan tahap DML delete(...) tahap untuk membuat pipeline data
yang dapat mengkueri dokumen lalu menghapus data.
Untuk mencegah penghapusan massal yang tidak disengaja, pipeline yang diakhiri dengan delete(...)
harus menyertakan setidaknya satu tahap where(...).
Semua tahap DML harus berada di akhir pipeline.
Misalnya, pipeline berikut menghapus semua dokumen users 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();
Konsistensi
Operasi Pipeline dengan tahap update(...) dan delete() tidak didukung dalam transaksi. Tahapan DML berjalan di luar
transaksi dengan perilaku berikut:
- Setiap dokumen diperbarui secara terpisah. Artinya, operasi tidak bersifat atomik di seluruh dokumen. Operasi gagal pada kesalahan pertama dan keberhasilan parsial mungkin terjadi.
- Tahap berikut didukung:
collection(...)collection_group(...)where(...)select(...)add_fields(...)remove_fields(...)let(...)sort(...)limit(...)offset(...)
- Tahapan berikut tidak didukung:
aggregate(...)distinct(...)unnest(...)find_nearest(...)- Tahapan multi-kueri seperti
union(...), gabungan, dan sub-kueri tidak diizinkan sebelum tahapan 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 dapat diubah beberapa kali. Untukdelete(...), upaya berikutnya setelah upaya pertama tidak akan berpengaruh.