Daten mit Pipelinevorgängen ändern

Verwenden Sie die Phasen der Datenbearbeitungssprache (DML) (update(...) und delete(...)), um Datenpipelines zu erstellen, mit denen Dokumente abgefragt und dann Daten gelöscht oder geändert werden können.

Versionsanforderungen

Für die auf dieser Seite beschriebenen Vorgänge ist die Firestore Enterprise-Version erforderlich.

Hinweis

Sie sollten wissen, wie Sie eine Datenbank mit Pipelinevorgängen abfragen .

Dokumente aktualisieren

Verwenden Sie die update(...) DML-Phase, um Datenpipelines zu erstellen , mit denen Dokumente abgefragt und dann Daten hinzugefügt oder geändert werden können.

Alle DML-Phasen müssen am Ende der Pipeline stehen. Die Dokumente, die in diese Phase gelangen, müssen das Feld __name__ enthalten, um anzugeben, welche Dokumente aktualisiert werden sollen. Der Vorgang schlägt fehl, wenn eines der Dokumente, die Sie aktualisieren möchten, nicht vorhanden ist.

Mit dem folgenden Vorgang wird beispielsweise eine Änderung des Datenmodells auf alle Dokumente in einer Sammlungsgruppe angewendet. Die Pipeline fügt allen Dokumenten in der Sammlungsgruppe users, denen dieses Feld fehlt, das Feld preferences.color hinzu.

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

Dokumente löschen

Verwenden Sie die delete(...) Phase DML-Phasen, um Datenpipelines zu erstellen , mit denen Dokumente abgefragt und dann Daten gelöscht werden können. Um versehentliche Massenlöschungen zu vermeiden, sollten Pipelines, die mit delete(...) enden, mindestens eine where(...)-Phase enthalten. Alle DML-Phasen müssen am Ende der Pipeline stehen.

Die folgende Pipeline löscht beispielsweise alle users Dokumente, bei denen address.users auf USA festgelegt ist und __create_time__ weniger als 10 Tage beträgt:

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

Konsistenz

Pipelinevorgänge mit update(...)\- und delete()-Phasen werden nicht innerhalb einer Transaktion unterstützt. DML-Phasen werden außerhalb einer Transaktion mit dem folgenden Verhalten ausgeführt:

  • Jedes Dokument wird unabhängig aktualisiert. Das bedeutet, dass Vorgänge nicht dokumentübergreifend atomar sind. Der Vorgang schlägt beim ersten Fehler fehl und ein Teilerfolg ist möglich.
  • Die folgenden Phasen werden unterstützt:
    • collection(...)
    • collection_group(...)
    • where(...)
    • select(...)
    • add_fields(...)
    • remove_fields(...)
    • let(...)
    • sort(...)
    • limit(...)
    • offset(...)
  • Die folgenden Phasen werden nicht unterstützt:
    • aggregate(...)
    • distinct(...)
    • unnest(...)
    • find_nearest(...)
    • Phasen mit mehreren Abfragen wie union(...), Joins und Unterabfragen sind vor einer DML-Phase nicht zulässig.

Beschränkungen

Beachten Sie die folgenden Einschränkungen für DML-Phasen:

  • DML-Phasen müssen die letzten Phasen in einer Pipelinedefinition sein, bevor .execute() aufgerufen wird.
  • Pipelinevorgänge mit update(...)\- und delete()-Phasen werden nicht innerhalb einer Transaktion unterstützt.
  • Wenn die Phase vor der DML-Phase mehrere Dokumente mit demselben __name__ erzeugt, wird jede Instanz verarbeitet. Bei update(...) bedeutet das, dass dasselbe Zieldokument mehrmals geändert werden kann. Bei delete(...) sind nachfolgende Versuche nach dem ersten Vorgang ohne Wirkung.