Aktualisieren

Mit der Phase update(...) werden vorhandene Dokumente aktualisiert.

Beispiele

Mit dem folgenden Vorgang wird beispielsweise eine Änderung des Datenmodells für alle Dokumente in einer Sammlungsgruppe nachgetragen. Die Pipeline fügt allen Dokumenten in der Sammlungsgruppe users, die dieses Feld nicht enthalten, 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();
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)

Verhalten

Alle Phasen der Datenbearbeitungssprache (Data Manipulation Language, DML) 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 nicht vorhanden ist. Die meisten Eingabephasen (z. B. collection(...), collection_group(...), database(...) und documents(...)) enthalten das Feld __name__ standardmäßig.

Optional können Sie transformations angeben, die direkt vor dem Schreiben der Dokumente angewendet werden sollen. Diese funktionieren genauso wie das Hinzufügen von add_fields(...) direkt vor der letzten Ausgabestufe. Die Ausdrücke werden im Kontext der vorherigen Dokumente ausgeführt.

Die Antwort enthält eine Zusammenfassung der Anzahl der geänderten Dokumente. Die folgende Antwort bestätigt beispielsweise, dass die Pipeline drei Dokumente geändert hat:

{documents_modified: 3L}

Beschränkungen

  • DML-Phasen unterstützen keine Cloud Firestore Security Rules. Versuche von DML-Vorgängen über Cloud Firestore Security Rules werden abgelehnt.

  • Während der Vorschau für diese Funktion können Sie keine DML-Phasen in einer Transaktion ausführen. Weitere Informationen zum Konsistenzverhalten finden Sie unter Konsistenz.

  • 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.