update(...) 階段會更新現有文件。
範例
舉例來說,下列作業會將資料模型變更回填至集合群組中的所有文件。管線會將 preferences.color 欄位新增至 users 集合群組中缺少該欄位的所有文件。
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();
Go
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)
行為
所有資料操縱語言 (DML) 階段都必須位於管道結尾。
進入這個階段的文件必須包含 __name__ 欄位,以識別要更新的文件。如果任何文件不存在,作業就會失敗。大多數輸入階段 (例如 collection(...)、collection_group(...)、database(...) 和 documents(...)) 預設包含 __name__ 欄位。
您可以選擇性提供 transformations,在寫入文件前套用。這類函式的運作方式與在最終輸出階段前新增 add_fields(...) 完全相同,且運算式會在先前文件的環境中執行。
回應會包含修改文件數量的摘要。舉例來說,下列回應確認管道修改了三份文件:
{documents_modified: 3L}
限制
DML 階段不支援 Cloud Firestore Security Rules。系統會拒絕透過 Cloud Firestore Security Rules 嘗試執行的 DML 作業。
在預先發布版期間,您無法在交易中執行 DML 階段。如要進一步瞭解一致性行為,請參閱「一致性」。
如果 DML 階段之前的階段產生多個具有相同
__name__的文件,系統會處理每個執行個體。對於update(...),這表示同一個目標文件可能會多次修改。如果是delete(...),第一次嘗試後續的嘗試都會是無運算。