【问题标题】:firestore set with merge true override object具有合并真实覆盖对象的firestore集
【发布时间】:2018-09-01 11:05:17
【问题描述】:

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

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

【问题讨论】:

  • 检查我的更新答案]

标签: javascript firebase merge google-cloud-firestore


【解决方案1】:

而不是使用set

你可以使用update on

"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
  rand1: "randAns1",
  rand2: "randAns2"
  }
}

您想要这样做是因为您正在向content 提供新属性。 rand1 vs newRand

Merge 会将新属性合并到现有对象中。

更新示例(点符号)

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

【讨论】:

  • 更新如果文档不存在则不创建。这就是.set( {merge: true})的漏洞点
【解决方案2】:

更改颜色后的实际代码:

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)

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2018-05-13
    • 2011-11-24
    • 2021-07-07
    • 2017-11-27
    • 2014-01-02
    • 1970-01-01
    • 2017-09-22
    • 2020-04-21
    相关资源
    最近更新 更多