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
});