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. Beiupdate(...)bedeutet dies, dass dasselbe Zieldokument mehrmals geändert werden kann. Beidelete(...)sind nachfolgende Versuche nach dem ersten Vorgang keine Operationen.