javascript - Firestore 嵌套 map - 用于更新嵌套对象的点表示法问题

标签 javascript firebase google-cloud-firestore

我遇到了 Firestore 嵌套 map 和点表示法的问题。我在 Firestore 上有一个嵌套 map ,并且我正在尝试使用点表示法更新另一个对象中的对象。但是,似乎在使用点表示法时,它将被调用的键与 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");
}

在此代码中,当我尝试使用点表示法更新嵌套映射(对象)时,它将键名称“options.expiration”和“options.updatedAt”与 Firestore 中的对象名称连接起来。

但是,如果我更新没有点表示法的嵌套映射,它会覆盖整个映射字段,这不是期望的结果。

创建屏幕截图

Create Firestore data

更新屏幕截图

Update Firestore data

如何正确使用点表示法来更新 Firestore 中的特定嵌套对象,而不会出现此串联问题?任何实现这一目标的见解或替代方法将不胜感激。预先感谢您!

最佳答案

如果您使用点表示法更新嵌套字段,则必须以点表示法添加完整路径,如下所示:

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: '...'
  }
})

关于javascript - Firestore 嵌套 map - 用于更新嵌套对象的点表示法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69962525/

相关文章:

javascript - TypeScript如何在数组的Reduce函数中设置累积值和初始值的类型

objective-c - cocoa OS X 应用程序上的 Firebase 通知集成

android - 空对象引用上的 Firebase firestore .QuerySnapshot.getDocumentChanges()'

java - 如何使用 Android 在 RecyclerView 中显示来自 Firestore 的数据?

javascript - 按钮在 html Canvas 上不起作用

javascript - Firefox 和 Chrome 不从 coldfusion 加载脚本包括?

ios - 关闭应用程序并再次打开,然后 PopToRootViewController 无法在 swift firebase 中工作

firebase - 了解 FirebaseFirestore 读取数据示例

javascript - RxJs5 中是否有相当于 RxJs<=4#ofArrayChanges 的内容

ios - Firebase 数据库不等于请求 - 替代解决方案(适用于 iOS)