有没有办法在Firestore中更新数组中的特定索引?

5 浏览
0 Comments

有没有办法在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})
    })
  }
}

0
0 Comments

问题的原因是在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的形式并使用特定的键字符串来实现。然而,这种方法需要重构数据库结构,因此作者选择了另一种方法来解决这个问题。

0
0 Comments

有没有办法从Firestore中的数组中更新特定索引的元素呢?这个问题的出现是因为原来的数据结构不支持直接更新特定索引的元素。为了解决这个问题,我将数组转换成了一个独立的文档,并在其中更新字段。这样做需要对数据库进行一些重构。

0
0 Comments

在Firestore中,有没有办法更新数组中的特定索引?答案是否定的!这是不可能的,因为如果要执行更新操作,您需要知道特定元素的索引。在谈论Cloud Firestore数组时,事情与您可能想的不同。

因为我们正在创建可以在多用户环境中使用的应用程序,所以想象一下如果一个用户想要编辑索引0处的值,另一个用户想要删除索引0处的值,同时还有其他用户可能想要在索引0处添加另一个项目。肯定会导致非常不同的结果,甚至可能导致数组越界异常。因此,Firestore对数组的操作有些不同。因此,您无法执行插入、更新或删除特定索引的操作。

如果这两种方法都不够帮助您,您可以获取整个文档,获取数组,进行修改,然后将其添加回数据库。

所以我这样做了,更新只在第一次起作用,第二次我得到了错误:stackoverflow.com/questions/53999186/…

“获取整个文档,获取数组,进行修改,然后将其添加回数据库”请记得在事务中执行此操作,否则您可能会覆盖其他客户端所做的更改。

0