使用{merge:true}设置和更新之间的区别


115

Cloud Firestore中,存在三种写入操作:

1)添加

2)设置

3)更新

在文档中说使用set(object, {merge: true})将合并对象和现有对象。

使用时会发生相同的情况。update(object) 如果有什么区别?Google重复逻辑似乎很奇怪。

Answers:


262

我了解差异的方式:

  • set如果没有,merge它将覆盖文档或创建它(如果尚不存在)

  • set使用merge会更新文档中的字段,或者如果不存在则创建它

  • update 将更新字段,但如果文档不存在将失败

  • create 将创建文档,但如果文档已存在则失败

您提供给set和的数据类型也有所不同update

因为set您总是必须提供文档形数据:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

使用,update您还可以使用字段路径来更新嵌套值:

update({
  'a.b.c': true
})

1
但是您create在API的哪里找到方法?
ZuzEL

2
请参阅cloud.google.com/nodejs/docs/reference/firestore/0.8.x/…。似乎Web API没有该方法。不确定您使用的平台是什么:)
Scarygami

10
您可以提及的另一个区别是set对文档形状的数据进行操作,其中update采用字段路径和值对。这意味着您可以使用来更改深层嵌套的值,update而这些值更麻烦set。例如:set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true)
吉尔·吉尔伯特

如果我想更新文档中的值,那么我要更新已经存在的文档就很有意义,所以我认为set + mergeall没那么有用,因为它将创建该文档不存在
John Balvin Arias

如果您提供给set命令的数据的字段为null,那么如果数据库中已经存在该字段,是否会将其设置为null?
user1023110

71

“使用合并设置”和“更新”之间的另一个区别(扩展了Scarygami的答案)是使用嵌套值时。

如果您的文档结构如下:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

并要添加 {"friend-uid-3" : true}

使用这个:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

将产生以下数据:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

但是update使用这个:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

将产生以下数据:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`

1
您是否尝试过自己测试?文档中有一节:“要更新文档的某些字段而不会覆盖整个文档,请使用update()方法...” 链接
Finlay Percy

2
我想到了。我以前只用数组尝试过。我想向该数组添加对象的地方,该数组的所有内容均被覆盖。它不适用于包含数组的字段...确实支持文档。
ravo10

1
经过测试,才得出相同的结论。我希望他们会添加一个{ merge: true }与更新功能具有相同作用的选项。
Johnride

1
感谢您的回答!这些示例虽然很简单,但比接受的答案更简洁,这对于我的用例来说更好。
naiveai

2
为了避免在使用时覆盖嵌套字段中的数据(如上面的答案)update,可以使用点表示法update如果您使用/不使用点符号,则的覆盖行为会有所不同。
Tedskovsky

7

每个文档:https : //firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

点表示法使您可以更新单个嵌套字段,而不会覆盖其他嵌套字段。如果更新不带点符号的嵌套字段,则将覆盖整个地图字段。

如上所述,这将替换整个朋友结构。

db.collection('users').doc('random-id').update({
    "friends": {
        "friend-uid-3": true
    }
})

这不是。

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.