Firestore 使用动态键更新嵌套对象中的字段
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);
但是仍然会删除此路径中的其他字段。
更新:
我的文档结构如下:
因此,在此结构内,我只想更新complexArray > 0 > innerObject > age。
将上述路径写入update()方法将删除complexArray级别上的所有其他内容。
对于第一级字段的简单更新可以正常工作,并且不会触及其他第一级字段。
是不是可能,Firestore的函数(如update())只能对文档的最低字段级别进行操作。一旦我将复杂对象放入文档中,就无法选择这些内部字段?
我知道有一个解决方案,即将这些“复杂”对象提取到单独的集合+文档中,并将其放入当前最低的文档级别中。我认为这是遵循FireStore原则更准确的方法。但是在应用程序端,使用复杂对象比每次都深入研究firestore集合+文档结构更容易。
因此,我的当前解决方案是将整个复杂对象发送到update()方法中,即使我只在应用程序端更改了一个字段。
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中嵌套对象中的字段,而不需要提前知道键的值。这为处理动态生成的键提供了方便和灵活性。