Firebase Firestore 中合并和合并字段的区别

pep*_*epe 9 firebase google-cloud-firestore angular6

我可以通过以下方法将数据传输到 Firebase Firestore 文档:

1) 添加()

2)设置()

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

Ali*_*hid 15

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

{
  name:'batman',
  city: 'gotham',
  isLeagueMember: true
}
Run Code Online (Sandbox Code Playgroud)

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

{
  isLeageMember:false,
  reason:'gone rogue'
}
Run Code Online (Sandbox Code Playgroud)

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

{
  name:'batman',
  city: 'gotham',
  isLeagueMember: false,
  reason:'gone rogue'
}
Run Code Online (Sandbox Code Playgroud)

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

{
  name:'batman',
  city: 'gotham',
  isLeagueMember: true,
  reason:'gone rogue'
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助。谢谢你。

  • 文档和此答案没有明确说明的是,仅当“merge”选项设置为“true”时,“mergeField”选项才相关。如果您愿意,它是一个可以修改另一个选项的行为的选项。 (3认同)

Bum*_*fel 6

需要注意的一件重要事情;{ merge: true }如果你问我的话,会有一种有点奇怪的互动。如果内部对象为空,它将替换现有的内部对象。但是,如果它不为空,它将更新内部对象中的指定属性并保留其余属性。

例如 set({ innerObject: {}, { merge: true })

到现有的{ innerObject: { someKey: 'someValue' } }

会导致{ innerObject: {} }

然而

set({ innerObject: { someOtherKey: 'someOtherValue' }, { merge: true })

到现有的{ innerObject: { someKey: 'someValue' } }

会导致{ innerObject: { someKey: 'someValue', someOtherKey: 'someOtherValue' } }

因此,请确保清除空的内部对象,除非您想从文档中删除它们。


Ale*_*amo -4

正如您已经注意到的,当使用 DocumentReference 的set()函数时,您可以将 SetOptions 的merge作为第二个参数传递:

将 set() 调用的行为更改为仅替换其数据参数中指定的值。set() 调用中省略的字段保持不变。

或者 SetOptions 的合并字段

更改 set() 调用的行为以仅替换指定的字段路径。任何未指定的字段路径都将被忽略并保持不变。

两者都是可选的,但两者都更改set充当合并/更新插入,而不是覆盖数据参数中未提供的所有字段。如果文档引用不存在,这将创建该文档,否则执行 的行为update

SetOptions.Merge 将根据您在其数据参数中指定的对象键进行合并。SetOptions.MergeFields 有点尴尬。浏览文档描述很容易,但它指出您指定的字段路径数组将是更新值时从数据参数中获取的唯一路径。这意味着并非数据参数中传递的所有键值都用于合并操作。

可以将其视为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' }

替换字段路径的位置。

  • 这个答案没有解决文档没有明确说明的问题:当 firestore 中没有现有记录时,合并字段中未指定的数据参数中的值会发生什么情况 (4认同)