Mengubah data dengan operasi Firestore Pipeline

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(...) dan delete() tidak didukung dalam transaksi.
  • Jika tahap sebelum tahap DML menghasilkan beberapa dokumen dengan __name__ yang sama, setiap instance akan diproses. Untuk update(...), artinya dokumen target yang sama mungkin diubah beberapa kali. Untuk delete(...), upaya berikutnya setelah yang pertama tidak akan ada operasi.