Modificare i dati con le operazioni della pipeline
Utilizza le fasi update(...) e delete(...) Data Manipulation Language (DML)
per creare pipeline di dati
che possono eseguire query per i documenti ed eliminare o modificare i dati.
Requisiti relativi alla versione
Le operazioni descritte in questa pagina richiedono la versione Enterprise di Firestore.
Prima di iniziare
Devi sapere come eseguire query su un database con le operazioni della pipeline.
Aggiornare i documenti
Utilizza la fase DML update(...) per creare pipeline di dati
che possono eseguire query per i documenti e poi aggiungere o modificare i dati.
Tutte le fasi DML devono essere alla fine della pipeline.
I documenti che entrano in questa fase devono includere il campo __name__ per
identificare quali documenti aggiornare. L'operazione non riesce se uno dei
documenti che tenti di aggiornare non esiste.
Ad esempio,
la seguente operazione esegue il backfill di una modifica delmodello dei datii in tutti i documenti di un
gruppo di raccolte. La pipeline aggiunge un campo preferences.color a tutti
i documenti nel gruppo di raccolte users in cui manca questo campo.
Node.js
const snapshot = await db.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant(null).as("preferences.color")) .removeFields("color") .update() .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not snapshot = ( client.pipeline() .collection_group("users") .where(Not(Field.of("preferences.color").exists())) .add_fields(Constant.of(None).as_("preferences.color")) .remove_fields("color") .update() .execute() )
Java
Pipeline.Snapshot snapshot = firestore.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant((String) null).as("preferences.color")) .removeFields("color") .update() .execute().get();
Elimina documenti
Utilizza le fasi DML della delete(...) fase per creare pipeline di dati
che possono eseguire query per i documenti ed eliminare i dati.
Per evitare eliminazioni collettive accidentali, le pipeline che terminano con delete(...)
devono includere almeno una fase where(...).
Tutte le fasi DML devono essere alla fine della pipeline.
Ad esempio, la seguente pipeline 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();
Coerenza
Le operazioni della pipeline con le fasi update(...) e delete()
non sono supportate all'interno di una transazione. Le fasi DML vengono eseguite al di fuori di una
transazione con il seguente comportamento:
- Ogni documento viene aggiornato in modo indipendente. Ciò significa che le operazioni non sono atomiche tra i documenti. L'operazione non riesce al primo errore ed è possibile un successo parziale.
- Sono supportate le seguenti fasi:
collection(...)collection_group(...)where(...)select(...)add_fields(...)remove_fields(...)let(...)sort(...)limit(...)offset(...)
- Le seguenti fasi non sono supportate:
aggregate(...)distinct(...)unnest(...)find_nearest(...)- Le fasi di più query come
union(...), i join e le subquery non sono consentite prima di una fase DML.
Limitazioni
Tieni presenti le seguenti limitazioni per le fasi DML:
- Le fasi DML devono essere le ultime in una definizione di pipeline prima di chiamare
.execute(). - Le operazioni della pipeline con le fasi
update(...)edelete()non sono supportate all'interno di una transazione. - 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 verranno eseguiti.