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

IT技术 javascript reactjs firebase google-cloud-firestore
2021-03-14 02:51:39

有没有办法从 Firebase/firestore 中的数组更新特定索引?

 export const editComment = (comment) => {
 return (dispatch, getState, { getFirebase, getFirestore }) => {
    const firestore = getFirestore();

    firestore.collection('topics').doc(comment.topicId).update({

     comments:  <--- this is array of objects


    }).then(() => {
      dispatch({ type: 'EDIT_COMMENT' })
    }).catch((error) => {
      dispatch({ type: 'EDIT_COMMENT_ERROR', error})
    })
  }
}
3个回答

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

不,那里没有!这是不可能的,因为如果您想执行更新,您需要知道该特定元素的索引。在谈论 Cloud Firestore 阵列时,您可能会想到的情况有所不同。

因为我们正在创建可在多用户环境中使用的应用程序,请尝试考虑如果用户想要编辑索引 0 处的值,其他用户想要删除索引 0 处的值,同时某些用户想要删除该值会发生什么其他用户可能想要在索引 0 处添加另一个项目。当然,您最终会得到非常不同的结果,为什么不,甚至数组越界异常。所以带数组的 Firestore 操作有点不同。因此,您无法在特定索引处执行诸如插入、更新或删除之类的操作。

如果这两种方法对您的帮助还不够,您应该获取整个文档,获取数组,修改它并将其添加回数据库。

所以我做到了,更新只在第一次有效,第二次我收到错误:stackoverflow.com/questions/53999186/...
2021-05-04 02:51:39

将数组转换为它自己的单独文档并更新其中的字段。这就是我所做的。为此,我不得不稍微重组我的数据库。

对我来说,我使用 firebase SDK for flutter 和 nodeJS env。对于云功能,我发现了以下解决方案。

这是一个有点hacky的解决方法

也许我们可以通过使用数组索引作为子映射的键字符串来以映射而不是数组的形式保存列表

所以你在云火商店中构建了这样的数据

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"}

如果您在 firebase 中注意到,它会key2在此操作中更新整个字段,但让您可以更轻松地访问更新该索引..

我的问题是我必须重组所有具有地图列表的字段以成为地图中的地图才能获得该访问权限

我不会这样做,不会重构我的整个数据库来做到这一点,我检索整个文档,(成本 1 次读取)在客户端修改并再次更新整个文档(1 次写入)

我不喜欢它,但也许有一天我会使用它