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

Tcc*_*tnn 10 javascript firebase google-cloud-firestore

我有一个数据结构,如:

在此输入图像描述

我想在"第一个"对象中编辑"test"键的值.我按照https://firebase.google.com/docs/firestore/manage-data/add-data上的文档进行操作

但它对我不起作用.

nodejs代码:

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

firestore中的结果: 在此输入图像描述

"test2"键消失了.但是,我只想更新"test"的值并保留"test2".

解决这个问题的任何方法?

小智 25

彼得的解决方案很棒,但它不适用于动态密钥。这段代码要好得多:

var nestedkey = 'test';
var setAda = dbFirestore.collection('users').doc('alovelace').update({
    [`first.${nestedkey}`]: "12345"
});
Run Code Online (Sandbox Code Playgroud)

  • 这本质上与 Peter 的解决方案相同,只是它使用模板字符串...... (4认同)
  • 这就是我一直在寻找的。多谢:) (2认同)
  • 万分感谢。我尝试了 ${nestedKey} 但它没有起作用,直到我用 [] 来吓唬它。 (2认同)

Pet*_*dad 14

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

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

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

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

那么您将拥有:

 first
  test: "12345"
  test2: "abcd"
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,这不适用于 .set({...}, {merge: true) 。 (3认同)
  • 如果我想删除“test”映射的“test.first”条目,是否需要执行“get()”操作,手动删除它,然后更新整个“first”映射?或者是否有类似的操作来删除地图中的嵌套字段?@彼得 (2认同)
  • @ppicom你需要做这样的事情 `update({"first.test" :firebase.firestore.FieldValue.delete()});` (2认同)

Alv*_*nda 7

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

var setAda = dbFirestore.collection('users').doc('alovelace').update({
    `first.${variableIfNedded}.test`: "12345"
});
Run Code Online (Sandbox Code Playgroud)


Joo*_*soo 7

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

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