Użyj etapów update(...) i delete(...) języka manipulacji danymi (DML), aby tworzyć potoki danych, które mogą wysyłać zapytania o dokumenty, a następnie usuwać lub modyfikować dane.
Wymagania dotyczące wersji
Operacje opisane na tej stronie wymagają wersji Enterprise Firestore.
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 na tym etapie muszą zawierać pole __name__, aby 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 poniższa 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();
Usuwanie dokumentów
Użyj etapów DML delete(...)stage, aby utworzyć potoki danych, które mogą wyszukiwać 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 dokumenty users, w których pole address.users ma wartość USA, a pole __create_time__ ma wartość mniejszą 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ą i mają następujące działanie:
- Każdy dokument jest aktualizowany niezależnie. Oznacza to, że operacje nie są niepodzielne w przypadku różnych dokumentów. Operacja kończy się niepowodzeniem przy pierwszym błędzie i może się częściowo powieść.
- 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(...)- Etapy z wieloma zapytaniami, takie jak
union(...), złączenia i podzapytania, nie są dozwolone przed etapem DML.
Ograniczenia
Pamiętaj o tych ograniczeniach dotyczących etapów DML:
- Etapy DML muszą być ostatnimi etapami w definicji potoku przed wywołaniem funkcji
.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 z tym samym
__name__, każda instancja jest przetwarzana. W przypadkuupdate(...)oznacza to, że ten sam dokument docelowy może być modyfikowany wiele razy. W przypadkudelete(...)kolejne próby po pierwszej nie będą miały żadnego efektu.