Ganti Dengan (Tahap Transformasi)

Deskripsi

Mengganti kolom dalam dokumen yang ada dengan kolom dalam ekspresi tertentu.

Ekspresi dapat berupa peta literal atau ekspresi yang menghasilkan sebuah peta. Jika ekspresi tertentu tidak menghasilkan peta, tahap ini akan menampilkan error.

Ada 3 mode yang didukung:

  • full_replace: Mengganti seluruh dokumen dengan hasil ekspresi yang diberikan, dan menghapus kolom yang tidak muncul di dalamnya.
  • merge_overwrite_existing: Menggabungkan ekspresi dengan dokumen yang ada, dan menimpa nilai kolom dalam dokumen dengan nilai dalam ekspresi
  • merge_keep_existing: Menggabungkan ekspresi dengan dokumen yang ada, dan hanya menambahkan nilai kolom jika nilai tersebut tidak ada dalam dokumen.

Contoh

Buat koleksi cities dengan dokumen berikut:

Node.js

await db.collection("cities").doc("SF").set({name: "San Francisco", population: 800000, location: {country: "USA", state: "California"}});
await db.collection("cities").doc("TO").set({name: "Toronto", population:  3000000, province: "ON", location: {country: "Canada", province: "Ontario"}});
await db.collection("cities").doc("NY").set({name: "New York", location: {country: "USA", state: "New York"}});
await db.collection("cities").cov("AT").set({name: "Atlantis", population: null});

Menggunakan mode full_replace untuk mendapatkan versi dokumen yang termutasi

Ekstrak kolom location bertingkat, dengan menghapus semua data lainnya:

Node.js
  const names = await db.pipeline()
    .collection("/cities")
    .replace_with(Field.of("location"), "full_replace")
    .execute();
    
Java
Pipeline.Snapshot names =
    firestore.pipeline().collection("cities").replaceWith(field("location")).execute().get();

Yang menghasilkan dokumen berikut:

{ country: "USA", state: "California" },
{ country: "Canada", province: "Ontario" },
{ country: "USA", state: "New York" },
{ }

Menggunakan mode merge_overwrite_existing untuk menetapkan kolom

Tetapkan kolom population di semua dokumen ke 0, dengan mengganti nilai yang ada:

Node.js
  const censoredResults = await db.pipeline()
    .collection("/cities")
    .replace_with(map("population", 0), "merge_overwrite_existing")
    .execute();
    

Yang menghasilkan dokumen berikut:

{name: "San Francisco", population: 0, location: {country: "USA", state: "California"}},
{name: "Toronto", population: 0, province: "ON", location: {country: "Canada", province: "Ontario"}},
{name: "New York", population: 0, location: {country: "USA", state: "New York"}},
{name: "Atlantis", population: 0}

Menggunakan mode merge_keep_existing untuk menambahkan nilai default

Menetapkan nilai default untuk location jika tidak muncul dalam dokumen:

Node.js
  const defaultedResults = await db.pipeline()
    .collection("/cities")
    .replace_with(map("location", "unknown"), "merge_keep_existing")
    .execute();
    

Yang menghasilkan dokumen berikut:

{ name: "San Francisco", population: 800000, location: { country: "USA", state: "California" } },
{ name: "Toronto", province: "ON", population: 3000000, location: { country: "Canada", province: "Ontario" } },
{ name: "New York", location: { country: "USA", state: "New York" } },
{ name: "Atlantis", population: null, location: "unknown" }