更新 Firestore 中的嵌套变量字段

问题描述

假设一个 firestore 数据库充满了这个结构,是 Events 和 Users 集合:

Firestore
    -Events
        -1612483200
            -peopleSignedDict
                -Alex
                    -state: 1
                -Mark:
                    -state: 0
        -1606172400
            -peopleSignedDict                
    -Users
        -1zyXSMMlgiaUusUNLQWAxfsI4pM2
            -name: Alex
        -4zyXSMMlgiaUusUNLQWAxfsI4pM2
            -name: Mark

我正在使用 Node.js 并尝试更新 Events.1612483200.peopleSignedDict.Alex.state 以将状态从 1 更改为 0。为了实现它,我正在尝试执行以下操作:

var randomName = getRandomdbname();
db.collection('Events').doc('1612483200').set({
            'peopleSignedDict.'+randomName+'.state': 0
        });

但是我的 IDE (PHPStorm) 对我大喊大叫,告诉我这个语法无效,这应该是解决这个问题的正确语法吗?

解决方法

有几种方法可以做到这一点。

我最喜欢的是先在一个单独的变量中构造键,然后在集合中使用它:

let randomName = getRandomDBName();
let updates = {};
updates['peopleSignedDict.'+randomName+'.state'] = 0;
db.collection('Events').doc('1612483200').update(updates);

但是一个常见的(更短的)替代方法是:

let randomName = getRandomDBName();
db.collection('Events').doc('1612483200').update({ 
  [`peopleSignedDict.${randomName}.state`]: 0;
});

我实际上不确定最后一个片段中是否需要 [],所以如果您遇到问题,请在没有它​​们的情况下尝试并告诉我。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...