在Firebase Flatter上更新阵列内的项目

在Firebase Flatter上更新阵列内的项目,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我已经制作了一个聊天应用程序,我希望用户能够将聊天室标记为收藏夹,或者将聊天室静音 我的数据库结构如下图所示 我想要的是当用户试图使聊天室静音或将其标记为收藏夹时, 我只更新与聊天室ID匹配的项目,但经过大量搜索后,我发现Firebase不允许您更新数组的元素,您只能从数组中添加或删除 这是我将聊天室静音或标记为收藏夹的功能: static final Firestore dbReference = Firestore.instance; static Future<void>

我已经制作了一个聊天应用程序,我希望用户能够将聊天室标记为收藏夹,或者将聊天室静音

我的数据库结构如下图所示

我想要的是当用户试图使聊天室静音或将其标记为收藏夹时, 我只更新与聊天室ID匹配的项目,但经过大量搜索后,我发现Firebase不允许您更新数组的元素,您只能从数组中添加或删除

这是我将聊天室静音或标记为收藏夹的功能:

static final Firestore dbReference = Firestore.instance;

static Future<void> currentUserChatroomChangeMuteOrFavouriteMethod({
    @required String chatroomId,
    @required bool muteValue,
    @required bool favouriteValue,
    @required ChatroomMuteFavouriteOption operationToBeDone,
  }) async {

 DocumentReference docRef = dbReference
        .collection("user_chatrooms")
        .document(CurrentUserDetails.id);

    DocumentSnapshot docSnapshot = await docRef.get();
    Map<String, dynamic> docData = docSnapshot.data;

    List<Map<String, dynamic>> userChatrooms =
        (docData["chatrooms"] as List<dynamic>)
            .map((chatroom) => Map<String, dynamic>.from(chatroom))
            .toList();

    for (int index = 0; index < userChatrooms.length; index++) {
      Map<String, dynamic> chatroom = userChatrooms[index];
      if (chatroom["chatroomId"] == chatroomId) {
        if (operationToBeDone == ChatroomMuteFavouriteOption.muteOperation) {
          chatroom["isMuted"] = !muteValue;
        } else {
          chatroom["isMarkedFavourite"] = !favouriteValue;
        }

        break;
      }
    }

    await docRef.updateData({"chatrooms": userChatrooms});
 }

static final Firestore dbReference=Firestore.instance;
静态未来CurrentUserChatRoomChangeMuteOrFavoriteMethod({
@必需的字符串聊天室ID,
@所需的布尔值,
@所需的bool FavoriteValue,
@所需的聊天室MuteFavoriteOption操作ToBedone,
})异步的{
DocumentReference docRef=dbReference
.收藏(“用户聊天室”)
.document(CurrentUserDetails.id);
DocumentSnapshot docSnapshot=等待docRef.get();
Map docData=docSnapshot.data;
列出用户聊天室=
(docData[“聊天室”]作为列表)
.map((聊天室)=>map.from(聊天室))
.toList();
for(int index=0;index
所以基本上我得到了所有的数据,我更新了我想要的字段,我再次更新了数据,但这不是一个好的解决方案,因为我也得到了我不需要的聊天室

我怎样才能有效地做这个手术


谢谢。

这是一个完美的解决方案。为了更新数组的内容,您必须读取文档,修改内存中的数组,然后使用新数组更新文档。除了将数组转换为子集合中的文档之外,实在没有办法提高效率。

我认为这可能是一个糟糕的解决方案的原因是,例如,如果用户有100个聊天室,在我看来,获取和更新所有数组以更改项目的字段效率不高。我认为除了我提到的以外,您没有其他选择。太好了,谢谢您的回答!我的是一个实时视频通话应用程序。我决定将所有活动用户放在一个数组中。避免高firebase费用(每次读取文档的成本)。因此,当一个用户更新数组,而另一个用户拉同一个数组时,可能会导致一些用户丢失一些细节。这里有解决方案的任何人。(我可以使用更好的方法)