更新 Firestore 文档中嵌套对象中的字段?

IT技术 javascript firebase google-cloud-firestore
2021-03-06 09:49:50

我有一个数据结构,如:

在此处输入图片说明

我想编辑“第一个”对象中“测试”键的值。我遵循了https://firebase.google.com/docs/firestore/manage-data/add-data上的文档

但它对我不起作用。

节点代码:

var setAda = dbFirestore.collection('users').doc('alovelace').update({
        first : {
            test: "12345"
            }
});

firestore 中的结果: 在此处输入图片说明

“test2”键不见了。但是,我只想更新“test”的值并保留“test2”。

这个问题有什么解决方案吗?

6个回答

根据您提供的链接,它是这样说的:

如果您的文档包含嵌套对象,您可以在调用 update() 时使用“点表示法”来引用文档中的嵌套字段:

因此,您需要使用dot notation才能仅更新一个字段而不会覆盖,如下所示:

var setAda = dbFirestore.collection('users').doc('alovelace').update({
    "first.test": "12345"
});

那么你将拥有:

 first
  test: "12345"
  test2: "abcd"
@ppicom 你需要做这样的事情 update({"first.test" :firebase.firestore.FieldValue.delete()});
2021-05-10 09:49:50
由于某种原因,这不适用于 .set({...}, {merge: true) 。
2021-05-13 09:49:50
如果我想删除地图test.first条目test,是否需要执行一个get()操作,手动删除它然后更新整个first地图?或者是否有类似的操作来删除地图中的嵌套字段?@彼得
2021-05-15 09:49:50
从文档中不清楚使用 的第二种类型签名时的行为存在差异DocumentReference.update,这导致硬写:firebase.google.com/docs/reference/js/...
2021-05-20 09:49:50
你试过下面的stackoverflow.com/a/57217966/7015400 @rendom 吗?
2021-05-20 09:49:50

Peter 的解决方案很棒,但它不适用于动态密钥。以下代码可以使用它:

var nestedkey = 'test';
var setAda = dbFirestore.collection('users').doc('alovelace').update({
    [`first.${nestedkey}`]: "12345"
});
@Sam 编辑。谢谢你。
2021-04-28 09:49:50
试图编辑掉不必要的“此代码要好得多”部分,但错误的是“编辑队列已满”
2021-05-16 09:49:50
这与 Peter 的解决方案本质上相同,只是它使用模板字符串...
2021-05-17 09:49:50
万分谢意。我试过 ${nestedKey} 但直到我用 [] 畏缩它才起作用。
2021-05-20 09:49:50

如果有人使用TypeScript(例如在 Cloud 函数中),这里是用点表示法更新嵌套字段的代码。

var setAda = dbFirestore.collection('users').doc('alovelace').update({
    `first.${variableIfNedded}.test`: "12345"
});
当我尝试这种方法时,例如saveData[`picks.${matchId}.points`] = pickValue;saveData 是我最终写入 firebase 的 Map。我得到了一个名为“picks.94904.points”的新属性,而不是写入地图。我是typescript的新手,所以我假设有语法错误。任何想法为什么会发生这种情况?
2021-04-22 09:49:50
@Vino 确保您使用的是 TypeScript。您正在使用的代码究竟是什么?
2021-04-25 09:49:50
@Chamanhm,您的代码过于复杂了。试着让它更简单。祝你好运
2021-05-12 09:49:50

如果您不希望在 'first' 字段不存在时发生异常,请尝试使用setwith{merge: true}选项而不是update.

var setAda = dbFirestore.collection('users').doc('alovelace').set({
        first : {
            test: "12345"
        }
}, {merge: true});

试试这个:它像那样工作吗?

var setAda = dbFirestore.collection('users').doc('alovelace').update({
        "first.test" : "12345"
});