Firebase Firestore 中 merge 和 mergeFields 的区别

Posted

技术标签:

【中文标题】Firebase Firestore 中 merge 和 mergeFields 的区别【英文标题】:Difference between merge and mergeFields in Firebase Firestore 【发布时间】:2019-09-16 07:01:34 【问题描述】:

我可以通过以下方法将数据保存到 Firebase Firestore 文档中:

1) 添加()

2) 设置()

我很清楚如何将数据添加到 Firestore,其中没有混淆。但我的问题是 Firebase Firestore 中的“set”方法有两个 setOption,例如 merge 和 mergefields。这两个设置选项有什么区别,我认为这两个选项都在做同样的工作。如何实现 setOption 'mergeFIeld'?我找不到它的任何文档。

【问题讨论】:

【参考方案1】:

这就是我的解释。 IF merge = true 被指定给一个集合操作 THEN 它就像 Object.assign(firestoreDoc, yourpayload)。例如,如果 firebaseDoc 的内容是这样的:


  name:'batman',
  city: 'gotham',
  isLeagueMember: true

而你的有效载荷(JSON)内容是这样的:


  isLeageMember:false,
  reason:'gone rogue'

使用 merge=true 设置操作后,firestoreDoc 将如下所示


  name:'batman',
  city: 'gotham',
  isLeagueMember: false,
  reason:'gone rogue'

另一方面,对于 mergeFields,您可以指定要更新的字段集。因此,如果我采用上面的示例,但这次使用合并字段选项 [name, reason] 设置操作,那么结果(设置完成后的 firebaseDoc)将是:


  name:'batman',
  city: 'gotham',
  isLeagueMember: true,
  reason:'gone rogue'

这也让我有些困惑,直到我发现最大的线索是 merge 是一个布尔值,而 mergeFields 是一个数组。

这对于批处理操作非常方便。

希望这会有所帮助。谢谢。

【讨论】:

【参考方案2】:

正如您已经注意到的,当使用 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'

替换字段路径的位置。

【讨论】:

我认为 Mergefield 仅适用于嵌套字段..?如果您不介意,请给我举个例子 您应该根据信息自行尝试并自己查看行为。 好的,我会尝试..但是请您给我解释一下关于合并字段仅适用于嵌套字段。? 此答案未解决文档未明确说明的问题:当 firestore 中没有现有记录时,数据参数中未在合并字段中指定的值会发生什么情况 对不起,但我也觉得这个答案不是很有帮助。只解释文档,文档本身不是很具描述性。

以上是关于Firebase Firestore 中 merge 和 mergeFields 的区别的主要内容,如果未能解决你的问题,请参考以下文章

无法在firebase.firestore.CollectionReference中使用Array firebase.firestore.Query为什么?

Firestore 配置 - Firebase

使用Firestore需要firebase-firestore.js文件吗?

Firestore doc Update with Merge true

无法使用 SwiftUI 从 Firebase / Firestore 中删除文档

firebase2.default.firestore 不是一个函数 - React Firebase