有啥方法可以从 Firestore 中的数组更新特定索引

Posted

技术标签:

【中文标题】有啥方法可以从 Firestore 中的数组更新特定索引【英文标题】:Is there any way to update a specific index from the array in Firestore有什么方法可以从 Firestore 中的数组更新特定索引 【发布时间】:2019-05-28 23:29:55 【问题描述】:

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

【问题讨论】:

其实不能。您需要获取数据,然后合并和更新它。 你能指导我怎么做吗?我做了这样的事情:***.com/questions/53999186/… 但它只在第一次更新时有效,当我第二次尝试时出现错误 您应该在文档 topicId 中创建另一个集合。当数据变大时,比在文档中创建数组或对象要好 我所有的组件都基于这个 cmets 数组,所以我需要重写整个代码并添加新集合而不是这个数组?为什么没有解决这个简单而基本的更新操作的方法,上帝... 我创建了 subsollection,但是当我通过 mapStateToProps 从 firestore 获取数据时,我只看到正常数据而没有在集合内创建子集合,有什么帮助吗? 【参考方案1】:

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

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

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

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

【讨论】:

所以我做到了,更新只在第一次有效,第二次我收到错误:***.com/questions/53999186/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

这是一个有点老套的解决方法

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

所以您在 Cloud Fire 存储中构建了这样的数据

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 次写入)

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

【讨论】:

以上是关于有啥方法可以从 Firestore 中的数组更新特定索引的主要内容,如果未能解决你的问题,请参考以下文章

可以在 arrayUnion 方法中传递 Firestore DocumentReference 吗?

如何使用 Android 更新 Firestore 中的数组元素?

如何使用 Firestore 函数更新地图中的数组?

如何从 Firestore 获取数组?

如何更新firestore中的数组[重复]

Firestore 更新数组字段中的单个项目