首页 > 解决方案 > Firestore 云功能:嵌套地图中的动态键

问题描述

在 Firestore 中,我有一个由 UID 组成的文档,每个 UID 都包含一个键值对的嵌套映射。我需要使用 Firebase 云功能向文档添加一个新条目,并且我正在使用 Typescript。我找不到将动态键设置为嵌套字段的方法。使用静态键它可以工作:

firestoredocument.set({
    thisIsStatic : {
       nestedField: "value" 
   }
}, {merge: true})

但是使用动态密钥,它会将动态密钥输出到 Firestore,其中没有任何数据(动态值:{})

var dynamic = "dynamicValue"

firestoredocument.set({
   [dynamic] : {
       nestedField: "value" 
   }
}, {merge: true})

打印输入对象会输出;{"dynamicValue":{"nestedField":"value"}} 但在文档中 dynamicField 的值为空。

我也尝试使用 .update() 而不是 .set() 获得相同的结果。

将嵌套 Map 输入到函数输出错误:

未处理的错误 错误:Update() 需要单个 JavaScript 对象或字段/值对的交替列表,可以后跟可选的前置条件。参数“dataOrField”的值不是有效的 Firestore 文档。输入不是普通的 JavaScript 对象。

编辑:

根据建议,我也尝试过:

const dynamic = 'dynamicValue'
const str1 = JSON.stringify({staticValue : { nestedField: "value" }})
const str2 = JSON.stringify({[dynamic] : { nestedField: "value" }})
functions.logger.log(str1)
functions.logger.log(str2)
  

await admin.firestore().doc('mydocumentpath')
  .set(JSON.parse(str1))

await admin.firestore().doc('mydocumentpath')
  .update(JSON.parse(str2))

这将注销:

{"staticValue":{"nestedField":"value"}}
{"dynamicValue":{"nestedField":"value"}}

但无论 str1 和 str2 更新顺序如何,Firestore 文档都会如下所示:

staticValue: {
    nestedField: "value"
}

dynamicValue: {}

标签: typescriptgoogle-cloud-firestore

解决方案


推荐阅读