Użyj etapów języka manipulowania danymi (DML) update(...) i delete(...), aby tworzyć potoki danych, które mogą wysyłać zapytania o dokumenty, a następnie usuwać lub modyfikować dane.
Wymagania związane z wersją
Operacje opisane na tej stronie wymagają wersji Firestore Enterprise.
Zanim zaczniesz
Musisz wiedzieć, jak wysyłać zapytania do bazy danych za pomocą operacji potoku.
Aktualizowanie dokumentów
Użyj etapu DML update(...), aby tworzyć potoki danych
, które mogą wysyłać zapytania o dokumenty, a następnie dodawać lub modyfikować dane.
Wszystkie etapy 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. Operacja nie powiedzie się, jeśli którykolwiek z dokumentów, które próbujesz zaktualizować, nie istnieje.
Na przykład ta operacja wypełnia 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();
Usuń dokumenty
Użyj etapu DML delete(...) stage, aby tworzyć potoki danych
, które mogą wysyłać zapytania o dokumenty, a następnie usuwać dane.
Aby zapobiec przypadkowemu zbiorczemu usuwaniu, potoki kończące się na delete(...) powinny zawierać co najmniej 1 etap where(...).
Wszystkie etapy DML muszą znajdować się na końcu potoku.
Na przykład ten potok usuwa wszystkie users dokumenty, w których
address.users ma wartość USA, a __create_time__ jest mniejszy niż 10 dni:
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();
Spójność
Operacje potoku z etapami update(...) i delete() nie są obsługiwane w ramach transakcji. Etapy DML są wykonywane poza transakcją z tymi właściwościami:
- Każdy dokument jest aktualizowany niezależnie. Oznacza to, że operacje nie są niepodzielne w przypadku wielu dokumentów. Operacja kończy się niepowodzeniem przy pierwszym błędzie i możliwy jest częściowy sukces.
- Obsługiwane są te etapy:
collection(...)collection_group(...)where(...)select(...)add_fields(...)remove_fields(...)let(...)sort(...)limit(...)offset(...)
- Te etapy nie są obsługiwane:
aggregate(...)distinct(...)unnest(...)find_nearest(...)- Przed etapem DML nie są dozwolone etapy z wieloma zapytaniami, takie jak
union(...), łączenia i podzapytania.
Ograniczenia
Pamiętaj o tych ograniczeniach dotyczących etapów DML:
- Etapy DML muszą być ostatnimi etapami w definicji potoku przed wywołaniem
.execute(). - Operacje potoku z etapami
update(...)idelete()nie są obsługiwane w ramach transakcji. - 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 być modyfikowany wiele razy. W przypadkudelete(...)kolejne próby po pierwszej będą operacjami bez efektu.