如何使用flutter从firestore中删除/更新数组对象中的指定索引

Posted

技术标签:

【中文标题】如何使用flutter从firestore中删除/更新数组对象中的指定索引【英文标题】:How to delete/update specified index in an array object from firestore with flutter 【发布时间】:2022-01-08 13:53:28 【问题描述】:

我正面临 firestore 数组对象的删除/更新问题。这是我的子集合看起来像

我的flutter web app 中有一个选项可以删除或更新问题。 questionnaire 是一个数组,所有索引都是map。 有没有可能直接删除或更新索引的方法?我见过一些解决方案,其中所有数组元素都被读回应用程序并删除我们需要删除的项目并添加需要更新的项目。我将在一个数组中有大约 150 个问题,所以从性能的角度来看,我认为这不是一种有效的方法。所以我尝试了几种方法来删除数据

FirebaseFirestore.instance
          .collection('exam')
          .doc(examDocID)
          .collection('questionnaire')
          .doc(_questionnaireDocID)
          .update(
        'questionnaire': '$index': FieldValue.delete()
      ).then((_) 
        print('question deleted');
      ).catchError((onError) 
        print(onError);
      );

'questionnaire.$index':  FieldValue.delete()
'questionnaire': FieldValue.arrayRemove([index])

它曾经从我的大多数尝试中删除数组中的所有元素。 有人可以让我知道是否有任何解决方法可以解决此问题

【问题讨论】:

【参考方案1】:

有没有办法直接删除或更新索引?

不,没有。

我见过一些解决方案,其中所有数组元素都被读回应用程序并删除我们需要删除的项目并添加需要更新的项目。

是的,这种情况可以这样处理。

我将在一个数组中有大约 150 个问题,所以从性能的角度来看,我认为这不是一种有效的方法。

这不是效率低下,而是相反。除此之外,在计费方面,它只意味着读取文档和写入文档,无论您一次从数组中添加或删除多少项目。

如果要使用FieldValue.delete() 从数组中删除特定对象,则应使用all the data in the object and not partial data。我什至写过一篇关于在 Cloud Firestore 中更新对象数组的文章:

How to update an array of objects in Firestore?

【讨论】:

以上是关于如何使用flutter从firestore中删除/更新数组对象中的指定索引的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter 在 Firestore 中删除具有特定值的多个文档

无法从 Firestore 文档中删除字段 (Flutter)

如何使用 Flutter 在 Firestore 中删除集合中的所有文档

如何使用颤振删除 Firestore 文档中的字段

在 Flutter 列表视图中删除 Firestore 数据

如何使用 Flutter 从 Firestore 中的 ListView 获得无限滚动