Update (Output Stage)
The update(...) stage updates existing documents.
Examples
For example,
the following operation backfills a data model change to all documents in a
collection group. The pipeline adds a preferences.color field to all
all documents in the users collection group that are missing that field.
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();
Behavior
All data manipulation language (DML) stages must come at the end of the pipeline.
The documents coming into this stage must include the __name__ field to
identify which documents to update. The operation fails if any of the
documents don't exist.
Most Input stages (like collection(...), collection_group(...),
database(...), and documents(...)) include the __name__ field by default.
You can optionally provide transformations to apply right before writing
the documents. These act identically to adding an
add_fields(...) right before the final output stage and the
expressions run in the context of the previous documents.
The response includes a summary of the number of documents modified. For example, the following response confirms that the pipeline modified three documents:
{documents_modified: 3L}
Limitations
DML stages don't support Firestore Security Rules. DML operation attempts through Firestore Security Rules are denied.
During the Preview for this feature, you cannot run DML stages in a transaction. For more information on consistency behavior see Consistency.
If the stage preceding the DML stage produces multiple documents with the same
__name__, each instance is processed. Forupdate(...), this means the same target document might be modified multiple times. Fordelete(...), subsequent attempts after the first will be no-ops.