当前位置: 首页 > 知识库问答 >
问题:

云Firestore:使用动态键更新嵌套对象中的字段

朱运诚
2023-03-14

遵循firestore的官方文件:

{
    name: "Frank",
    favorites: { food: "Pizza", color: "Blue", subject: "recess" },
    age: 12
}

// To update favorite color:
db.collection("users").doc("frank").update({
    "favorites.color": "Red"
})

我想使用动态键而不是颜色。

db.collection("users").doc("frank").update({
    "favorites[" + KEY + "].color": true
});

这当然是不可能的,并且会引发错误。

我一直在尝试这样做:

db.collection("users").doc("frank").update({
    favorites: {
        [key]: {
            color": true
        }
    }
});

它实际上是用正确的键进行更新,但不幸的是,它正在覆盖其他键(它们正在被删除)。

共有3个答案

邢博学
2023-03-14

关于一个潜在陷阱的注意事项:在发现您可以使用点语法更新嵌套字段后,我尝试以同样的方式使用set(),因为无论对象是否存在,我都需要它来工作:

var updateObj = {['some.nested.property']: 9000};
docRef.set(updateOb, {merge: true});

不幸的是,这不起作用——它设置了一个键为some.nested.property的属性。不一致,但没关系。

幸运的是,似乎set(updateObj,{merge:true})会进行深度合并,因此如果将更新对象构造为完全嵌套的对象,那么嵌套对象也会正确合并:

// create the object
db.doc('testCollection/doc').set({p1: {['p2']: {p3: true}}}, {merge: true})
// update the existing object
db.doc('testCollection/doc').set({p1: {['p2']: {p4: true}}}, {merge: true})

// result is now this:
{ p1: { p2: { p4: true, p3: true } } }
羊舌子瑜
2023-03-14

此解决方案对我有效:

db.collection('users').doc('frank').update({
  [`favorites.${key}.color`]: true
});
萧宁
2023-03-14

我找到了受Firebase解决方案启发的解决方案(将“/”替换为“.”)。

var usersUpdate = {};
usersUpdate[`favorites.${key}.color`] = true;

db.collection("users").doc("frank").update(usersUpdate);
 类似资料:
  • 我有一个静态结构的对象: 我想按键更新它的属性。例如,如果我收到 然后我想更新对象,并有: 我该怎么办?我试图创建一个新对象,类似这样: 我不知道如何从变量中设置键和值的名称

  • mongodb新手,尝试更新文档的多个数组对象字段。没有得到预期的结果 文档结构: 基于id需要更新日期 Spring启动代码 但是当我运行这个查询时,它返回null。有人能帮我吗?谢谢,我也试过了

  • 我正在尝试更新MongoDB中嵌套对象中的一个键值。目前,我的做法是覆盖整个嵌套对象,我如何改变一个键-值对?

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 谁能告诉我我在这里做错了什么?从console.log,我可以看到日期功能正在正常工作。但是,即使在之后,时间戳也不会更新。提前感谢!