【问题标题】:Firestore Update fields in nested objects with dynamic key具有动态键的嵌套对象中的 Firestore 更新字段
【发布时间】:2018-11-12 21:55:43
【问题描述】:

我需要使用动态键更新嵌套对象中的字段。 路径可能如下所示: 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 这帮助我使更新路径动态化。 在此之后所需的解决方案可能看起来像

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

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

更新:

我的 Doc 的结构如下:

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

将上述路径写入 update() 方法将删除 complexArray 级别上的所有其他内容。 对一级字段进行简单的更新即可正常工作,并且不会影响其他一级字段。

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

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

【问题讨论】:

  • 我刚刚尝试过,它工作正常。你能分享你用来更新的完整代码吗?
  • 嗨@Daddelbob,您找到解决方案了吗?
  • 我没有找到解决方案,但我认为更扁平的数据结构将是实现所需的 Firestore 数据库使用的第一步。尽管可以多次嵌套 decuments 和 collections,但我的经验告诉我应该尽可能避免这种情况,因为这会导致使用有限的 firestore 命令集进行更复杂的更新操作。
  • complexArray 是地图还是数组?当我测试它时,如果它是地图,我的其他字段值不会被删除。如果它是一个数组,则整个数组将被替换为一个地图。

标签: firebase cloud google-cloud-firestore


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2019-02-13
    • 2021-04-14
    • 2018-08-15
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多