Zaktualizuj

Etap update(...) aktualizuje istniejące dokumenty.

Przykłady

Na przykład ta operacja wypełnia wstecznie zmianę modelu danych we wszystkich dokumentach w grupie kolekcji. Potok dodaje pole preferences.color do wszystkich dokumentów w grupie kolekcji users, w których brakuje tego pola.

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)

Zachowanie

Wszystkie etapy języka manipulacji danymi (DML) muszą znajdować się na końcu potoku.

Dokumenty wchodzące na ten etap muszą zawierać pole __name__, aby można było określić, które dokumenty mają zostać zaktualizowane. Jeśli którykolwiek z dokumentów nie istnieje, operacja zakończy się niepowodzeniem. Większość etapów wejściowych (takich jak collection(...), collection_group(...), database(...) i documents(...)) domyślnie zawiera pole __name__.

Opcjonalnie możesz podać transformations, które mają zostać zastosowane tuż przed zapisaniem dokumentów. Działają one tak samo jak dodanie add_fields(...) tuż przed ostatnim etapem wyjściowym, a wyrażenia są wykonywane w kontekście poprzednich dokumentów.

Odpowiedź zawiera podsumowanie liczby zmodyfikowanych dokumentów. Na przykład ta odpowiedź potwierdza, że potok zmodyfikował 3 dokumenty:

{documents_modified: 3L}

Ograniczenia

  • Etapy DML nie obsługują Cloud Firestore Security Rules. Próby operacji DML za pomocą Cloud Firestore Security Rules są odrzucane.

  • Podczas wersji testowej tej funkcji nie można uruchamiać etapów DML w transakcji. Więcej informacji o spójności znajdziesz w artykule Spójność.

  • Jeśli etap poprzedzający etap DML generuje wiele dokumentów o tej samej nazwie __name__, każdy z nich jest przetwarzany. W przypadku update(...) oznacza to, że ten sam dokument docelowy może zostać zmodyfikowany wiele razy. W przypadku delete(...) kolejne próby po pierwszej będą operacjami bez efektu.