假设我有一个包含以下数据的文档(无子集合)
"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
rand1: "randAns1",
rand2: "randAns2"
}
}
现在,我想更改favouriteColor
并覆盖content
,而不更改age
。因此,我使用:
ref.set({
favouriteColor: "blue",
content: {
newRand: "newRandAns",
newRand2: "newRandAns2"
},
}, {merge:true})
想要的结果:
"kdsjkasdlkfsalk" : {
favouriteColor: "blue",
age: 20,
content: {
newRand: "newRandAns",
newRand2: "newRandAns2"
}
}
实际结果:
"kdsjkasdlkfsalk" : {
favouriteColor: "blue",
age: 20,
content: {
newRand: "newRandAns",
newRand2: "newRandAns2",
rand1: "randAns1",
rand2: "randAns2"
}
}
如您所见,{merge:true}
防止覆盖content
,而只是添加新字段。
我可以想到2个解决方案,但是它们要么涉及首先检索所有数据,要么首先将content
设置为布尔值,然后将其设置为所需对象。有没有更好的方法来获得想要的结果?
答案 0 :(得分:1)
代替使用set
您可以在{p>上使用update
"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
rand1: "randAns1",
rand2: "randAns2"
}
}
您要执行此操作,因为您要为content
提供新的属性。 rand1 vs newRand
合并会将新属性合并到现有对象中。
更新示例(点符号)
firebase.firestore().doc("kdsjkasdlkfsalk").update({
"color": "someNewColor",
"content.rand1": "someNewRandValue",
"content.rand2": "someNewRandValue"
});
或
const content = {
rand1: "someNewRandValue",
rand2: "someNewRandValue"
}
firebase.firestore().doc("kdsjkasdlkfsalk").update({
"color": "someNewColor",
content
});
答案 1 :(得分:0)
更改颜色后的实际代码:
var obj = {
favouriteColor: "brown",
age: 20,
content: {
rand1: "randAns1",
rand2: "randAns2"
},
{merge:true}
}
您可以清理内容属性
obj.content = {};
以及新值
obj.content.newRand = "newRandAns";
obj.content.newRand2 = "newRandAns2";
然后将您的obj
对象设置为Firebase
ref.set(obj)