使用合并恢复更新 - 如何覆盖文档的一部分



在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 个参数调用。">

这是有道理的:-(

最新更新