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 przypadkuupdate(...)oznacza to, że ten sam dokument docelowy może zostać zmodyfikowany wiele razy. W przypadkudelete(...)kolejne próby po pierwszej będą operacjami bez efektu.