在Firestore中更新文档时,我想保留大部分文档,但更改一个包含对象的属性。
我有什么
{
name: "John Doe",
email: "me@example.com",
friends: {
a: {...},
b: {...},
c: {...},
d: {...},
e: {...},
f: {...},
}
}
现在,我有一个新的朋友对象,如{x: ..., y: ..., z: ...}
我想覆盖文档的friends
树,但保留所有其他字段。
我希望它是什么样子
{
name: "John Doe",
email: "me@example.com",
friends: {
x: {...},
y: {...},
z: {...},
}
}
但是,如果我做一个firestore.doc(...).update({friends: {...}}, { merge: true })
我目前得到什么
{
name: "John Doe",
email: "me@example.com",
friends: {
a: {...},
b: {...},
c: {...},
d: {...},
e: {...},
f: {...},
x: {...},
y: {...},
z: {...},
}
}
我知道我可以进行两次更新,即删除字段然后再次设置,或者我可以阅读文档,更改对象并保存而不合并。
但是,难道没有一种聪明的方法可以覆盖对象(地图(,同时保持文档的其余部分不变吗?
由于您使用的是update()
方法,因此您只需在没有合并选项的情况下调用它。
firestore.doc(...).update({friends: {...}})
请注意,update()
有两个不同的签名:
update(data: UpdateData)
和
update(field: string | FieldPath, value: any, ...moreFieldsAndValues: any[])
如果传递给方法的第一个参数是对象,它将认为您使用了第一个签名,因此只能传递一个参数。所以做
firestore.doc(...).update({friends: {...}}, { merge: true })
应生成以下错误:
">错误:函数 DocumentReference.update(( 需要 1 个参数,但使用 2 个参数调用。">
另一方面,你可以这样称呼它:
firestore
.collection('...')
.doc('...')
.update(
'friends.c',
'Tom',
'email',
'mynew_email@example.com',
'lastUpdate',
firebase.firestore.FieldValue.serverTimestamp()
);
最后,为了完成,请注意,如果您执行以下操作(传递一个字符串(
firestore
.collection('...')
.doc('...')
.update(
'a_string'
);
您将收到以下错误
">错误:函数文档引用.update(( 至少需要 2 个参数,但使用 1 个参数调用。">
这是有道理的:-(