Elimina

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. Per update(...), ciò significa che lo stesso documento di destinazione potrebbe essere modificato più volte. Per delete(...), i tentativi successivi al primo non avranno effetto.