Firestore 方法 docRef.set(someData, merge:true) 和 docRef.update(someData) 之间的区别? [复制]

Posted

技术标签:

【中文标题】Firestore 方法 docRef.set(someData, merge:true) 和 docRef.update(someData) 之间的区别? [复制]【英文标题】:Difference between Firestore methods docRef.set(someData, merge:true) and and docRef.update(someData)? [duplicate]Firestore 方法 docRef.set(someData, merge:true) 和 docRef.update(someData) 之间的区别? [复制] 【发布时间】:2019-11-04 07:35:11 【问题描述】:

假设我的 Firestore 中存储了以下文档。

collection: "myColection"
  document: "myDocument"
    fields:
      someBoolean: true
      someArray: ['a','b','c']
      etc

Firebase DOCS - Source

问题

使用以下方法切换someBoolean字段有什么区别:

选项 1

const docRef = db.collection('myCollection').doc('myDocument');

await docRef.set(
  someBoolean: false
  , 
merge: true);

选项 2

const docRef = db.collection('myCollection').doc('myDocument');

await docRef.update(
  someBoolean: false
);

【问题讨论】:

【参考方案1】:

如果您已经将myDocument 文档存储在myCollection 集合中,则没有区别。

如果没有现有的myDocument 文档,则会出现差异:set() 可以工作,但update() 无效。

请参阅文档https://firebase.google.com/docs/reference/js/firebase.firestore.DocumentReference#update,其中说“如果应用于不存在的文档,更新将失败。”

【讨论】:

【参考方案2】:

您可以在Difference between set with merge: true and update找到答案

简而言之,如果新字段/文档不存在,则使用合并设置将创建新字段/文档,而如果文档不存在,则更新将失败。

对于嵌套值,更新函数的工作方式也不同。它将替换嵌套对象,而 set 会将新值与当前值合并。

【讨论】:

【参考方案3】:

set,覆盖文档,如果找不到则创建

set merge: true 将更新文档中的字段,如果找不到则创建

update 将更新字段,但如果文档不存在则会抛出错误

一个重要的细节,你必须提供路径:

set( foo:  bar:  baz: true   ,  merge: true )

更新,这就够了

update(
  'foo.bar.baz': true
)

【讨论】:

【参考方案4】:

如果文档不存在,更新将失败。

【讨论】:

以上是关于Firestore 方法 docRef.set(someData, merge:true) 和 docRef.update(someData) 之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

StreamBuilder 未显示来自 firestore 的数据

缺少或不足的权限 Firestore 数据库规则

Nuxtjs 在 asyncData 中获取 Firestore 数据

如何将 Firebase Firestore 数据添加到 s-s-r Nuxt Apps Vuex Store

Swift 和 Cloud Firestore 事务 - getDocuments?

子集合的 Firestore 监听器