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.js文件吗?
Firestore doc Update with Merge true