Javascript 具有合并真实覆盖对象的firestore集
假设我有一个包含以下数据的文档(无子集合) 现在我想更改Javascript 具有合并真实覆盖对象的firestore集,javascript,firebase,merge,google-cloud-firestore,Javascript,Firebase,Merge,Google Cloud Firestore,假设我有一个包含以下数据的文档(无子集合) 现在我想更改收藏夹颜色并覆盖内容,而不更改年龄。因此,我使用: ref.set({ favouriteColor: "blue", content: { newRand: "newRandAns", newRand2: "newRandAns2" }, }, {merge:true}) 想要的结果是: "kdsjkasdlkfsalk" : { favouriteCo
收藏夹颜色
并覆盖内容
,而不更改年龄
。因此,我使用:
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
设置为布尔值,然后将其设置为所需的对象。有没有更好的方法来获得想要的结果?更改颜色后的实际代码:
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)
而不是使用set
您可以在上使用update
"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
rand1: "randAns1",
rand2: "randAns2"
}
}
之所以要这样做,是因为您正在为内容提供新属性<代码>rand1 vs newRand
“合并”将新特性合并到现有对象中
更新示例(点表示法)
或
检查我的更新答案]更新如果文档不存在,请不要创建文档。这就是.set({merge:true})
"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
rand1: "randAns1",
rand2: "randAns2"
}
}
firebase.firestore().collection("someCol").doc("kdsjkasdlkfsalk").update({
"color": "someNewColor",
"content.rand1": "someNewRandValue",
"content.rand2": "someNewRandValue"
});
const content = {
rand1: "someNewRandValue",
rand2: "someNewRandValue"
}
firebase.firestore().collection("someCol").doc("kdsjkasdlkfsalk").update({
"color": "someNewColor",
content
});