如何更新 firebase 数组中的地图数据?(扑)

Bac*_*ain 3 dart firebase flutter google-cloud-firestore flutter-web

我正在为一个项目使用 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)});
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果: firestore结构

我想要做的只是将地图中的 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:
      }
Run Code Online (Sandbox Code Playgroud)

所以我查看了一些打印语句,发现具有匹配组 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:
          }
Run Code Online (Sandbox Code Playgroud)

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

Dou*_*son 6

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

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