Zuz*_*zEL 73 database firebase google-cloud-firestore
在Cloud Firestore中,有三种写操作:
1)添加
2)设置
3)更新
在文档中,它表示使用set(object, {merge: true})
将对象与现有对象合并.
当你使用时会发生同样的情况update(object)
那么有什么不同呢?谷歌会复制逻辑似乎很奇怪.
Sca*_*ami 154
我理解差异的方式:
set
没有合并将覆盖文档或创建它(如果它还不存在)
set
with merge将更新文档中的字段,如果不存在则创建它
update
将更新字段,但如果文档不存在则将失败
create
将创建文档但如果文档已存在则失败
您提供给set
和的数据类型也有所不同update
.
因为set
你总是需要提供文件形状的数据:
set(
{a: {b: {c: true}}},
{merge: true}
)
Run Code Online (Sandbox Code Playgroud)
随着update
你也可以使用现场路径用于更新嵌套值:
update({
'a.b.c': true
})
Run Code Online (Sandbox Code Playgroud)
Fin*_*rcy 50
"使用合并"和"更新"之间的另一个区别(扩展Scarygami的答案)是使用嵌套值时.
如果您的文档结构如下:
{
"friends": {
"friend-uid-1": true,
"friend-uid-2": true,
}
}
Run Code Online (Sandbox Code Playgroud)
并想要添加 {"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
}
}
Run Code Online (Sandbox Code Playgroud)
然而update
使用这个:
db.collection('users').doc('random-id').update({
"friends": {
"friend-uid-3": true
}
})
将导致此数据:
`{
"friends": {
"friend-uid-3": true
}
}`
Run Code Online (Sandbox Code Playgroud)
小智 10
每个文档: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
}
})
Run Code Online (Sandbox Code Playgroud)
这不。
db.collection('users').doc('random-id').update({
"friends.friend-uid-3": true
})
Run Code Online (Sandbox Code Playgroud)
进一步补充上面的答案,如果您想删除地图中的嵌套字段,那么您可能需要使用update
或 ,set
具体取决于您的用例。
如果您从以下内容开始并希望删除除此之外的所有配置文件条目,"user1"
那么您有两个选择。
{
"users": {
"profiles": {
"user1": ...,
"user2": ...
}
}
Run Code Online (Sandbox Code Playgroud)
这将profiles
用提供的任何内容覆盖
update({
'users.profiles': { 'user1': ... }
})
Run Code Online (Sandbox Code Playgroud)
这会将删除的内容合并到现有的配置文件中,留下未删除的内容
set({
users: {
profiles: {
'user2': FieldValue.delete(),
'user3': FieldValue.delete(),
...
}
}
}, { merge: true })
Run Code Online (Sandbox Code Playgroud)
这仅适用于Map
s,因为set
和update
都会覆盖数组,除非您显式使用特定于数组的运算符,例如arrayUnion
。