Firestore使用动态密钥更新嵌套对象中的字段

我需要使用动态密钥更新嵌套对象中的字段 . 路径可能如下所示:level1.level2.DYNAMIC_KEY:updatedValue update-method删除level1上的所有其他内容,而不是仅更新嵌套对象中的字段 . update()更像是set() . 我究竟做错了什么?

我已经尝试了以下内容:

我阅读了文档https://firebase.google.com/docs/firestore/manage-data/add-data#update-data,但这是a)静态和b)仍然删除其他字段 .

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

这将是静态的并导致

update({
'level1.level2.STATIC_KEY' : 'updatedValue'
});

然后我发现这个答案https://stackoverflow.com/a/47296152/5552695帮助我使updatepath动态化 . 在此之后所需的解决方案可能看起来像

field[`level1.level2.${DYNAMIC_KEY}`] = updateValue;
update(field);

但仍然:它将删除此路径中的其他字段 .

UPDATE:

我的文件结构如下:
Snapshot

所以在这个结构里面我只想更新complexArray> 0> innerObject> age

将上述路径写入update()方法将删除complexArray级别的所有其他内容 . 对第一级字段的简单更新工作正常,并允许其他第一级字段不变 .

是否有可能,像update()这样的firestore函数只能作用于文档的最低字段级别 . 一旦我将复杂的对象放入文档中,就不可能选择这样的内部字段?我知道会有解决方案将这些“复杂”对象提取到单独的集合文档中,并将它们放入我当前的最低文档级别 . 我认为这将是一种更准确的方式来坚持FireStore原则 . 但是在应用程序方面,使用复杂对象比在垃圾收集文档结构中更深入地挖掘更容易 .

所以我目前的解决方案是将整个复杂对象发送到update()方法,即使我只在应用程序端更改了一个字段 .

回答(1)

3 years ago

您是否尝试在请求中使用 { merge: true } 选项?

db
  .collection("myCollection")
  .doc("myDoc")
  .set(
    { 
      level1: { level2: { myField: "myValue" } }
    },
    { merge: true }
  )