使用合并True覆盖对象设置的Firestore

时间:2018-09-01 11:05:17

标签: javascript firebase merge google-cloud-firestore

假设我有一个包含以下数据的文档(无子集合)

"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设置为布尔值,然后将其设置为所需对象。有没有更好的方法来获得想要的结果?

2 个答案:

答案 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)