【问题标题】:Firestore nested maps (object), dot notation doesn't workFirestore 嵌套地图(对象),点表示法不起作用
【发布时间】:2021-11-14 11:27:37
【问题描述】:

我在 Firestore 上有一个嵌套映射,我正在尝试使用点表示法将一个对象更新为另一个对象,但是它将调用的键与 Firestore 中的对象名称连接起来,如果我在没有点表示法的情况下更新这个嵌套映射(对象),将覆盖整个地图字段。

if (doc && doc.exists) {
        await doc.ref.update({subscription: {chartslab: {
          "options.expiration": new Date(new Date()
              .getTime()+(10*24*60*60*1000)),
          "options.updatedAt": new Date().toISOString(),
        }}}).then(() => {
          return res.status(200).send("Document successfully updated!");
        });
      } else {
        await doc.ref.set({subscription: {chartslab: {options: {
          expiration: new Date(new Date().getTime()+(5*24*60*60*1000)),
        }}}});
        return res.status(200).send("Done");
      }

创建

更新

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    如果您使用点符号更新嵌套字段,则必须在点符号中添加完整路径,如下所示:

    await doc.ref.update({
      'subscription.chartLabs.options.expiration': 'value',
      'subscription.chartLabs.options.updatedAt': 'value'
    })
    

    有一个包flat 在这种情况下很有用,如果您有很多嵌套字段要更新。

    const flatten = require('flat');
    
    const updateObj = flatten({
      subscription: {
        chartLabs: {
          options: {
            expiration: '...',
            updatedAt: '...'
          }
        }
      }
    })
    

    由于您要更新整个“选项”对象,您可以试试这个:

    await doc.ref.update({
      'subscription.chartLabs.options': {
        expiration: '...',
        updatedAt: '...'
      }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 2021-11-25
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多