Löschen

delete() ist eine Phase der Datenbearbeitungssprache (DML), mit der eine Abfrage Dokumente basierend auf den Ergebnissen einer Abfrage entfernen kann. Diese Phase kann an das Ende einer Abfrage angehängt werden und löscht alle Dokumente, auf die das Feld __name__ aus der vorherigen Phase verweist.

Beispiele

Mit der folgenden Abfrage werden beispielsweise alle users Dokumente gelöscht, bei denen address.users auf USA festgelegt ist und __create_time__ weniger als 10 Tage beträgt:

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)

Verhalten

Antwort

Die Phase delete() gibt immer ein einzelnes Dokument wie { documents_modified: 28L } aus, das beschreibt, wie viele Dokumente gelöscht wurden.

Vollständiges Löschen von Sammlungen

Sie können alle Dokumente aus einer Sammlung löschen, indem Sie delete() an die Eingabephase anhängen, z. B.:

Node.js

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

Die Phase where(...) vor dem endgültigen delete() muss die Dokumente richtig einschränken, damit nur die erwarteten Dokumente aktualisiert werden. Es empfiehlt sich, die Abfrage zuerst ohne die endgültige Phase delete() auszuführen, um zu prüfen, ob nur die beabsichtigten Dokumente entfernt werden.

Endphase

Die Phase delete() muss am Ende einer Pipeline stehen. Es können keine weiteren Phasen angegeben werden.

Alle löschen

Standardmäßig werden mit der Phase delete() alle Dokumente entfernt, auf die in der vorherigen Phase verwiesen wird. Wenn Sie die Größe der Arbeitslast begrenzen möchten oder wissen, dass die Filterbedingungen genau einem Dokument entsprechen, kann vor dem endgültigen delete() ein limit(1) hinzugefügt werden, um die Gesamtarbeit zu begrenzen.

Sammlungsübergreifende Mutationen

Die endgültige Phase delete() wendet Mutationen auf jedes Dokument an, auf das von __name__ verwiesen wird (vorausgesetzt, alle erforderlichen Authentifizierungen sind vorhanden). Dazu gehört das Löschen von Dokumenten aus mehreren verschiedenen Sammlungen oder Sammlungsgruppen im Rahmen derselben Anfrage.

__name__ erforderlich

Für die Phase delete() muss die vorherige Phase ein Feld __name__ enthalten, das einen Dokumentverweis zum Entfernen enthält. Andernfalls tritt ein Laufzeitfehler auf. Wenn die Phase außerhalb einer Transaktion ausgeführt wird, kann dies zu einem Teilerfolg führen.

Die meisten Eingabephasen wie collection(...), collection_group(...), database(...) und documents(...), enthalten standardmäßig das Feld __name__. Dies ist also nur relevant, wenn Sie eine Projektion verwenden (z. B. select(...)) oder eine Transformation auf die Dokumente anwenden (z. B. aggregate(...)).

Die Antwort enthält eine Zusammenfassung der Anzahl der geänderten Dokumente. Die folgende Antwort bestätigt beispielsweise, dass in der Pipeline drei Dokumente geändert wurden:

{documents_modified: 3L}

Beschränkungen

  • DML-Phasen unterstützen keine Cloud Firestore Security Rules. Versuche von DML-Vorgängen über Cloud Firestore Security Rules werden abgelehnt.

  • Während der Vorschau für diese Funktion können Sie keine DML-Phasen in einer Transaktion ausführen. Weitere Informationen zum Konsistenzverhalten finden Sie unter Konsistenz.

  • Wenn die Phase vor der DML-Phase mehrere Dokumente mit demselben __name__ erzeugt, wird jede Instanz verarbeitet. Bei update(...) bedeutet dies, dass dasselbe Zieldokument mehrmals geändert werden kann. Bei delete(...) sind nachfolgende Versuche nach dem ersten Vorgang keine Operationen.