如何最好地在网络上的Firebase中检索给定聊天室的所有评论?

时间:2019-04-13 14:31:34

标签: javascript firebase firebase-realtime-database

我有一个带有聊天室和评论的实时Firebase应用程序。评论属于一个聊天室,一个聊天室可以包含许多评论。我只想检索给定房间的评论,但是现在我只能接收所有评论。

每次保存评论时,我还将其ID保存到它所属的房间。这样,每个房间都有其注释ID的列表。我可以使用chatRooms/${id}/commentIds检索聊天室的子注释ID列表。

// data structure is basically like this:
chatRooms: {
    ROOMID123: {
        title: "Room A",
        commentIds: {
            COMMENTIDABC: true,
            COMMENTIDXYZ: true
        }
    }
},
comments: {
    COMMENTIDABC: {
        message: "some message",
        parentRoomId: ROOMID123
    },
    COMMENTIDXYZ: {
        message: "Another message",
        parentRoomId: ROOMID123
    }
}

我可以根据房间的ID获取给定房间的评论ID,如下所示:

firebase.database().ref(`chatRooms/${chatRoomId}/commentIds`).on('value', 
    snapshot => {
        const commentsObject = snapshot.val();
        const commentIdsList = Object.keys(commentsObject);
    });

对我来说会更好

a)使用该commentIds列表仅检索给定房间的评论?如果是这样,我应该使用什么查询?

b)使用chatRoom的ID检索具有匹配parentRoomId的每个评论?如果是这样,尽管阅读了文档,我仍然不知道该怎么做。

谢谢!

1 个答案:

答案 0 :(得分:2)

我建议第三个选项:将每个聊天室的评论存储在单独的父节点中。像这样:

commentsPerRoom: {
  ROOMID123: {
    COMMENTIDABC: {
        message: "some message",
    },
    COMMENTIDXYZ: {
        message: "Another message",
    }
  }
}

使用上述结构,您可以通过一次直接查找来检索特定房间的评论:

firebase.database().ref(`commentsPerRoom/${chatRoomId}`).on('value', 

原因我将在您当前的数据结构中使用此数据结构:

  • 将评论存储为单个列表意味着您必须查询该列表。尽管Firebase Realtime Database可以很好地扩展,但是查询数据始终具有可扩展性限制。这就是为什么上面的数据结构允许直接查找而不需要查询的原因。
  • 通过注释ID加载单个注释绝对是可能的,并且由于Firebase pipelines the requests over a single connection的事实,速度不及某些开发人员认为的那么慢。但是这里似乎并不需要,因为评论已经与它们所属的房间有很强的1:n关联。每个注释仅属于一个房间,因此您最好在数据的结构方式上建立这种关系的模型,并保存所有查找内容。
  • 到目前为止,检索特定房间的评论是最常见的用例,而这种数据结构使该用例的效率最高。