有没有办法在Firestore中更新数组中的特定索引?
有没有办法在Firestore中更新数组中的特定索引?
有没有办法在Firebase/firestore中更新数组中的特定索引?
export const editComment = (comment) => { return (dispatch, getState, { getFirebase, getFirestore }) => { const firestore = getFirestore(); firestore.collection('topics').doc(comment.topicId).update({ comments: <--- 这是一个对象数组 }).then(() => { dispatch({ type: 'EDIT_COMMENT' }) }).catch((error) => { dispatch({ type: 'EDIT_COMMENT_ERROR', error}) }) } }
问题的原因是在Firestore中更新特定索引的数组元素比较困难。然而,通过将数组保存为一个map的形式,可以通过使用数组索引作为子map的键字符串来实现。这样可以更容易地更新特定索引的元素。
解决方法是将数据结构调整为以下形式:
key1: "value1" --> string
key2: --> map
> "0": {subKey1: "subValue1", subKey2: "subValue2"}
> "1": {subKey3: "subValue3", subKey4: "subValue4"}
> "2": {subKey5: "subValue5", subKey6: "subValue6"}
例如,如果要更新subValue4,可以使用以下代码:
await docReference.update({key2.1.subKey4: "theNewValueHere"});
这将更新Cloud Firestore中的文档,使其变为:
key1: "value1" --> string
key2: --> map
> "0": {subKey1: "subValue1", subKey2: "subValue2"}
> "1": {subKey3: "subValue3", subKey4: "theNewValueHere"}
> "2": {subKey5: "subValue5", subKey6: "subValue6"}
尽管这种方法可以更容易地更新特定索引的元素,但问题是需要重构所有具有列表的map字段,将其变为嵌套的map,以便可以实现这种访问方式。然而,由于这样做需要修改整个数据库结构,因此并不是一个理想的解决方法。
作者表示不愿意重构整个数据库结构来实现这个目的,而是选择在客户端检索整个文档(需要1次读取操作),在客户端修改后再次更新整个文档(1次写入操作)。虽然这种方法并不理想,但作者认为将来可能会使用这种方法。
因此,问题的原因是在Firestore中更新特定索引的数组元素比较困难,解决方法是通过将数组保存为map的形式并使用特定的键字符串来实现。然而,这种方法需要重构数据库结构,因此作者选择了另一种方法来解决这个问题。
在Firestore中,有没有办法更新数组中的特定索引?答案是否定的!这是不可能的,因为如果要执行更新操作,您需要知道特定元素的索引。在谈论Cloud Firestore数组时,事情与您可能想的不同。
因为我们正在创建可以在多用户环境中使用的应用程序,所以想象一下如果一个用户想要编辑索引0处的值,另一个用户想要删除索引0处的值,同时还有其他用户可能想要在索引0处添加另一个项目。肯定会导致非常不同的结果,甚至可能导致数组越界异常。因此,Firestore对数组的操作有些不同。因此,您无法执行插入、更新或删除特定索引的操作。
如果这两种方法都不够帮助您,您可以获取整个文档,获取数组,进行修改,然后将其添加回数据库。
所以我这样做了,更新只在第一次起作用,第二次我得到了错误:stackoverflow.com/questions/53999186/…
“获取整个文档,获取数组,进行修改,然后将其添加回数据库”请记得在事务中执行此操作,否则您可能会覆盖其他客户端所做的更改。