Ersetzen durch (Transformationsphase)

Beschreibung

Ersetzt Felder im vorhandenen Dokument durch die Felder in einem bestimmten Ausdruck.

Der Ausdruck kann entweder eine Literalzuordnung oder ein Ausdruck sein, der zu einer Zuordnung ausgewertet wird. Wenn ein bestimmter Ausdruck nicht zu einer Zuordnung ausgewertet wird, gibt diese Phase einen Fehler zurück.

Es gibt drei unterstützte Modi:

  • full_replace: Ersetzt das gesamte Dokument durch das Ergebnis des angegebenen Ausdrucks und lässt Felder aus, die nicht darin enthalten sind.
  • merge_overwrite_existing: Fügt den Ausdruck mit dem vorhandenen Dokument zusammen und überschreibt Feldwerte im Dokument mit Werten im Ausdruck.
  • merge_keep_existing: Fügt den Ausdruck mit dem vorhandenen Dokument zusammen und fügt nur Feldwerte hinzu, wenn sie im Dokument nicht vorhanden sind.

Beispiele

Erstellen Sie eine cities Sammlung mit den folgenden Dokumenten:

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});

Modus „full_replace“ verwenden, um eine geänderte Version des Dokuments zu erhalten

Extrahieren Sie das verschachtelte location Feld und verwerfen Sie alle anderen Daten:

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();

Dadurch werden die folgenden Dokumente erstellt:

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

Modus „merge_overwrite_existing“ verwenden, um Felder festzulegen

Setzen Sie das Feld population aller Dokumente auf 0 und überschreiben Sie vorhandene Werte:

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

Dadurch werden die folgenden Dokumente erstellt:

{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}

Modus „merge_keep_existing“ verwenden, um einen Standardwert hinzuzufügen

Standardwert für location festlegen, wenn er in einem Dokument nicht vorhanden ist:

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

Dadurch werden die folgenden Dokumente erstellt:

{ 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" }