Aggiorna

La fase update(...) aggiorna i documenti esistenti.

Esempi

Ad esempio, la seguente operazione esegue il backfill di una modifica del modello di dati in tutti i documenti di un gruppo di raccolte. La pipeline aggiunge un campo preferences.color a tutti i documenti del 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();
Vai
snapshot := client.Pipeline().
	CollectionGroup("users").
	Where(firestore.Not(firestore.FieldExists(firestore.FieldOf("preferences.color")))).
	AddFields(firestore.Selectables(
		firestore.ConstantOfNull().As("preferences.color"),
	)).
	RemoveFields(firestore.Fields("color")).
	Update().
	Execute(ctx)

Comportamento

Tutte le fasi di DML (Data Manipulation Language) devono essere alla fine della pipeline.

I documenti che entrano in questa fase devono includere il campo __name__ per identificare i documenti da aggiornare. L'operazione non riesce se uno dei documenti non esiste. La maggior parte delle fasi di input (come collection(...), collection_group(...), database(...) e documents(...)) include il campo __name__ per impostazione predefinita.

Facoltativamente, puoi fornire transformations da applicare subito prima di scrivere i documenti. Questi si comportano in modo identico all'aggiunta di un add_fields(...) subito prima della fase di output finale e le espressioni vengono eseguite nel contesto dei documenti precedenti.

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 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 verranno eseguiti.