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

时间:2018-06-03 11:12:21

标签: firebase cloud google-cloud-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);

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

更新

我的文件结构如下: Snapshot

所以在这个结构中我想只更新complexArray> 0> innerObject>的年龄

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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