正如您已经注意到的,当使用 DocumentReference 的 set() 函数时,您可以将 SetOptions 的 merge 作为第二个参数传递:
将 set() 调用的行为更改为仅替换其数据参数中指定的值。 set() 调用中省略的字段保持不变。
或者SetOptions的mergefields:
将 set() 调用的行为更改为仅替换指定的字段路径。任何未指定的字段路径都将被忽略并保持不变。
两者都是可选的,但都将set 更改为Merge/Upsert,而不是覆盖数据参数中未提供的所有字段。如果文档引用不存在,这将根据文档引用创建文档,否则执行update 的行为。
SetOptions.Merge 将根据您在其数据参数中指定的对象键进行合并。 SetOptions.MergeFields 有点尴尬。直接浏览文档描述很容易,但它指出您指定的字段路径数组将是更新值时从 data 参数中获取的唯一路径。这意味着并非所有传入 data 参数的键值都用于合并操作。
将mergeFields 视为从提供的数据中挑选键值并将其应用到您的操作中。这并不是真正必要的,它只是清理键值并传递给merge 的简写。请注意,它不会删除在字段路径数组中声明的数据中省略的字段,而是会收到一个 firebase 错误,即输入数据中缺少字段路径。似乎明确的 FieldValue.delete 是该行为的唯一选择。
对于嵌套字段路径,您确实可以获得一些额外的好处。您可以更明确地控制更新操作。
例如。对于文档name: { first: 'Jon', last: 'Doe' }
set({ name: { first: 'Jane' } }, { merge: true });
变成
name: { first: 'Jane', last: 'Doe' }
set({ name: { first: 'larry' } }, { mergeFields: ['name.first'] })
也变成了
name: { first: 'Jane', last: 'Doe' }
set({ name: { first: 'larry' } }, { mergeFields: ['name'] })
和其他人不一样
name: { first: 'Jon' }
替换字段路径的位置。