Usuń

delete() to etap języka manipulacji danymi (DML), który umożliwia zapytaniu usuwanie dokumentów na podstawie wyników zapytania. Ten etap można dołączyć na końcu zapytania. Spowoduje to usunięcie wszystkich dokumentów, do których odwołuje się pole __name__ z poprzedniego etapu.

Przykłady

Na przykład to zapytanie usuwa wszystkie users dokumenty, w których address.users ma wartość USA, a __create_time__ jest mniejsza 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();
Go
snapshot := client.Pipeline().
	CollectionGroup("users").
	Where(firestore.FieldOf("address.country").Equal("USA")).
	Where(firestore.FieldOf("__create_time__").Add(firestore.ConstantOf(10)).LessThan(firestore.CurrentTimestamp())).
	Delete().
	Execute(ctx)

Zachowanie

Odpowiedź

Etap delete() zawsze emituje pojedynczy dokument, np. { documents_modified: 28L }, który opisuje, ile dokumentów zostało usuniętych.

Usuwanie całej kolekcji

Aby usunąć wszystkie dokumenty z kolekcji, możesz dodać delete() do etapu wejściowego, np.:

Node.js

const results = await db.pipeline()
  .collection("/users")
  .delete()
  .execute();

Upewnij się, że etap where(...) przed końcowym etapem delete() prawidłowo ogranicza dokumenty, aby aktualizować tylko oczekiwane dokumenty. Dobrym rozwiązaniem jest najpierw uruchomienie zapytania bez końcowego etapu delete(), aby sprawdzić, czy usuwane są tylko zamierzone dokumenty.

Etap końcowy

Etap delete() musi znajdować się na końcu potoku. Nie można dodać żadnych kolejnych etapów.

Usuń wszystkie

Domyślnie etap delete() usuwa wszystkie dokumenty, do których odwołuje się poprzedni etap. Jeśli chcesz ograniczyć rozmiar obciążenia lub wiesz, że warunki filtra pasują do dokładnie 1 dokumentu, możesz dodać limit(1) przed końcowym etapem delete(), aby ograniczyć całkowitą pracę.

Mutacje w różnych kolekcjach

Końcowy etap delete() zastosuje mutacje do dowolnego dokumentu, do którego odwołuje się __name__ (przy założeniu, że podano wszystkie niezbędne dane uwierzytelniające). Obejmuje to usuwanie dokumentów z kilku różnych kolekcji lub grup kolekcji w ramach tego samego żądania.

Wymagane pole __name__

Etap delete() wymaga, aby poprzedni etap zawierał pole __name__, które zawiera odniesienie do dokumentu do usunięcia. W przeciwnym razie wystąpi błąd wykonania, a w przypadku uruchomienia poza transakcją może dojść do częściowego powodzenia.

Większość etapów wejściowych, takich jak collection(...), collection_group(...), database(...) i documents(...), domyślnie zawiera pole __name__, więc ma to znaczenie tylko w przypadku używania projekcji (np. select(...)) lub przeprowadzania transformacji dokumentów (np. aggregate(...)).

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.

  • W 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 kilka razy. W przypadku delete(...) kolejne próby po pierwszej będą operacjami bez efektu.