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

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

1) 添加()

2) 设置()

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

【问题讨论】:

    标签: firebase google-cloud-firestore angular6


    【解决方案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 中没有现有记录时,数据参数中未在合并字段中指定的值会发生什么情况
      • 对不起,但我也觉得这个答案不是很有帮助。只解释文档,文档本身不是很具描述性。
      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多