【问题标题】:How can I update map data that's in a array in firebase? (Flutter)如何更新 firebase 数组中的地图数据? (扑)
【发布时间】:2020-10-28 04:25:56
【问题描述】:

我在一个项目中使用了 Flutter Web 和 Firebase,但遇到了一个问题。我正在尝试更新 firestore 数组中的地图。

使用这个:

var val = [];
    val.add({'groupUID': groupUID, 'inviteStatus': status});
    var userInviteUID;
    await users
        .document(uid)
        .get()
        .then((value) => userInviteUID = value.data['inviteUID']);
    await invites
        .document(userInviteUID)
        .updateData({'invites': FieldValue.arrayUnion(val)});

我得到了这个结果: firestore structure

我想要做的只是将地图中的 1 更改为 2。我认为它会更新,因为它的值相同,但它只是将它添加到数组中。

我在堆栈上环顾四周,发现了一些方法,例如复制整个数组并在需要的地方更改它,然后将其添加回来。

但我想知道是否有办法通过对我的代码添加一些修改来避免这种情况。如果我应该使用更好的结构,也请告诉我。感谢您的帮助!

更新:

var ref = invites.document(userData.inviteUID);
    ref.get().then((value) async {
      var invitesList = value.data['invites'];

      switch (status) {
        case 1:
          break;
        case 2:
          var index;
          invitesList.asMap().forEach((key, value) {
            if (value['groupUID'] == groupUID) index = key;
          });
          invitesList.removeAt(index);
          await invites
              .document(userData.inviteUID)
              .updateData({'invites': FieldValue.arrayUnion(invitesList)});
          break;
        default:
      }

所以我查看了一些打印语句,发现具有匹配组 uid 的元素已被删除,但查看 firebase,该数组没有被覆盖任何东西......有什么想法吗?

最终更新:

var ref = invites.document(userData.inviteUID);
        ref.get().then((value) async {
          var invitesList = value.data['invites'];
    
          switch (status) {
            case 1:
              break;
            case 2:
              var index;
              invitesList.asMap().forEach((key, value) {
                if (value['groupUID'] == groupUID) index = key;
              });
              invitesList.removeAt(index);
              await invites
                  .document(userData.inviteUID)
                  .setData({'invites': FieldValue.arrayUnion(invitesList)});
              break;
            default:
          }

通过将 updateData 更改为 setData 来修复它。

【问题讨论】:

  • 你知道该怎么做吗,我陷入了同样的境地

标签: firebase flutter dart google-cloud-firestore flutter-web


【解决方案1】:

我在堆栈上环顾四周,发现了一些方法,例如复制整个数组并在需要的地方更改它,然后将其添加回来。

这正是您应该如何修改 Firestore 文档中数组的内容。 Firestore 不支持按索引更新数组元素。

【讨论】:

  • 我曾希望过去 3 个月 Firestore 文档有所改变,但看起来,Doug Stevenson 的回复仍然是唯一的答案。您需要复制整个数组,在本地进行更改,然后在 Firebase 上发出发布请求。
【解决方案2】:

setData 如果新文档不存在则创建一个新文档,但如果该文档存在,则数据将被覆盖。为防止这种情况发生,如果您想追加数据,可以使用SetOptions(merge: true)

set(someData, SetOptions(merge: true))

您也可以使用update 方法并为其提供更新的数据,伪代码如下所示:

List<Map<String, dynamic>> updatedList = [...];
Map<String, dynamic> updatedData = {
  'existing_map': updatedList,
};
  
var collection = FirebaseFirestore.instance.collection('collection');
collection 
    .doc('doc_id')
    .update(updatedData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2019-06-08
    • 2020-11-22
    相关资源
    最近更新 更多