delete() è una fase del linguaggio di manipolazione dei dati (DML) che consente a una query di rimuovere i documenti in base ai risultati di una query. Questa fase può essere collegata alla fine di una query ed eliminerà tutti i documenti a cui fa riferimento il campo __name__ della fase precedente.
Esempi
Ad esempio, la seguente query elimina tutti i documenti users con
address.users impostato su USA e con __create_time__ inferiore a 10 giorni:
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();
Vai
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)
Comportamento
Risposta
La fase delete() emette sempre un singolo documento come { documents_modified: 28L } che descrive il numero di documenti eliminati.
Eliminazione completa della raccolta
È possibile eliminare tutti i documenti da una raccolta aggiungendo delete() alla fase di input, come indicato di seguito:
Node.js
const results = await db.pipeline()
.collection("/users")
.delete()
.execute();
Assicurati che la fase where(...) prima della fase finale delete() limiti correttamente i documenti in modo da aggiornare solo quelli previsti. È una buona prassi eseguire prima la query senza la fase finale delete() per verificare che vengano rimossi solo i documenti previsti.
Fase finale
La fase delete() deve essere l'ultima di una pipeline, non è possibile fornire altre fasi.
Elimina tutto
Per impostazione predefinita, la fase delete() rimuove tutti i documenti a cui fa riferimento la fase precedente. Se vuoi limitare le dimensioni del carico di lavoro o sai che le condizioni di filtro corrispondono esattamente a un documento, puoi aggiungere limit(1) prima della fase finale delete() per limitare il lavoro totale.
Mutazioni tra raccolte
La fase finale delete() applicherà le mutazioni a qualsiasi documento a cui fa riferimento __name__ (supponendo che sia fornita tutta l'autenticazione necessaria). Ciò include l'eliminazione di documenti da più raccolte o gruppi di raccolte diversi nell'ambito della stessa richiesta.
__name__ obbligatorio
La fase delete() richiede che la fase precedente fornisca un campo __name__ che contenga un riferimento al documento da rimuovere. In caso contrario, si verificherà un errore di runtime e, se eseguita al di fuori di una transazione, l'operazione potrebbe avere esito positivo parziale.
La maggior parte delle fasi di input, come collection(...),
collection_group(...),
database(...) e
documents(...), include il campo __name__ per impostazione predefinita, quindi questa operazione è pertinente solo se utilizzi una
proiezione (ad esempio select(...)) o esegui una
trasformazione sui documenti (ad esempio
aggregate(...)).
La risposta include un riepilogo del numero di documenti modificati. Ad esempio, la seguente risposta conferma che la pipeline ha modificato tre documenti:
{documents_modified: 3L}
Limitazioni
Le fasi DML non supportano Cloud Firestore Security Rules. I tentativi di operazioni DML tramite Cloud Firestore Security Rules vengono negati.
Durante l'anteprima di questa funzionalità, non puoi eseguire le fasi DML in una transazione. Per ulteriori informazioni sul comportamento di coerenza, consulta Coerenza.
Se la fase precedente alla fase DML produce più documenti con lo stesso
__name__, ogni istanza viene elaborata. Perupdate(...), ciò significa che lo stesso documento di destinazione potrebbe essere modificato più volte. Perdelete(...), i tentativi successivi al primo non avranno effetto.