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

11 浏览
0 Comments

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

我需要更新嵌套对象中的一个字段,该字段具有动态键。路径可能像这样:level1.level2.DYNAMIC_KEY:updatedValue。更新方法会删除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

它帮助我使update路径变为动态的。

在此之后,期望的解决方案可能如下所示:

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

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

更新:

我的文档结构如下:

Snapshot

因此,在此结构内,我只想更新complexArray > 0 > innerObject > age

将上述路径写入update()方法将删除complexArray级别上的所有其他内容。

对于第一级字段的简单更新可以正常工作,并且不会触及其他第一级字段。

是不是可能,Firestore的函数(如update())只能对文档的最低字段级别进行操作。一旦我将复杂对象放入文档中,就无法选择这些内部字段?

我知道有一个解决方案,即将这些“复杂”对象提取到单独的集合+文档中,并将其放入当前最低的文档级别中。我认为这是遵循FireStore原则更准确的方法。但是在应用程序端,使用复杂对象比每次都深入研究firestore集合+文档结构更容易。

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

0
0 Comments

Firestore中更新嵌套对象中的字段时出现的问题是,如果嵌套对象中的键是动态生成的,即无法提前确定,那么如何进行更新操作呢?下面是解决这个问题的方法。

可以尝试在请求中使用{ merge: true }选项。具体的代码如下所示:

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

在这个示例中,我们使用了set()方法来更新嵌套对象中的字段。在更新时,我们将{ merge: true }作为第二个参数传递给set()方法。这个选项告诉Firestore要将更新合并到现有的文档中,而不是完全替换文档。

通过使用这个选项,我们可以更新嵌套对象中的字段,而不会影响其他字段的值。在上面的示例中,我们更新了level1对象中的level2对象的myField字段的值为myValue

使用{ merge: true }选项,我们可以灵活地更新嵌套对象中的字段,而不需要提前知道嵌套对象的键是什么。这对于动态生成的键非常有用,因为我们可以直接将更新的值传递给set()方法,而不需要事先构建完整的嵌套对象。

总结起来,通过在请求中使用{ merge: true }选项,我们可以轻松地更新Firestore中嵌套对象中的字段,而不需要提前知道键的值。这为处理动态生成的键提供了方便和灵活性。

0