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(...) 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 dapat diubah beberapa kali. Untuk delete(...), upaya berikutnya setelah upaya pertama tidak akan berpengaruh.