如何将Firebase实时更改监听到Reactjs中?

时间:2020-07-28 10:10:43

标签: javascript reactjs firebase google-cloud-firestore

我正在使用Firebase和React js创建一个实时聊天应用程序。我创建一个const函数= require('firebase-functions'); 在Firebase中称为“ 聊天”。此集合包含唯一的 room_ID (发送者和接收者的组合),并且该文档再次包含称为“消息”的子集合。邮件中的每个集合都有诸如邮件,时间,sender_id和读取状态之类的信息。

现在,每次我在聊天列表中收到新消息时,都必须更新对话。我使用 Reactjs componentDidMount()方法并编写以下代码:

firestore.collection('chats').doc("b7EuhNpdzXUlxhSgDkn2a6oReTl1_OZbrlH8FjmVFqSAtAc0A6TUHS3I3").collection("messages")
.onSnapshot(querySnapshot => {
  console.log("querySnapshot", querySnapshot)
  querySnapshot.docChanges().forEach(change => {
    console.log("change", change)
    if (change.type === 'added') {
      this.setState({messages : [...this.state.messages, change.doc.data()]});
      console.log('New city: ', change.doc.data());
    }
    if (change.type === 'modified') {
      console.log('Modified city: ', change.doc.data());
    }
    if (change.type === 'removed') {
      console.log('Removed city: ', change.doc.data());
    }
  });
});

您可以在这里看到,它仅适用于单个房间(b7EuhNpdzXUlxhSgDkn2a6oReTl1_OZbrlH8FjmVFqSAtAc0A6TUHS3I3)。我想以这样的方式编写查询,即它会监听每个联系人的消息。为此,我必须删除特定文档的限制。

请帮助我。

谢谢。

enter image description here

这是Firebase数据库的结构。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

我认为,获取所需数据的更好的方法之一是:

  • 将Firestore重组为仅具有messages集合,例如以下示例结构:

    messages collection
        uid
        receiverUserId
        senderUserId
        msg
        read
        time
    

通过这种方法,您可以通过执行以下操作来过滤正在查看的文档,例如当前经过身份验证的用户从多个用户接收的文档:

firestore.collection("messages")
  .where("receiverUserId", "==", authUid)
  .onSnapshot(function(querySnapshot) {
     //do whatever
});
  • 创建多个侦听器,每个chats文档一个,以观察其后续的messages子集合。因此,您可以执行以下 unested 代码:

    firestore.collection('chats').get().then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          var eachChatRef = firestore.collection('chats').doc(doc.documentID)
          var messagesRef = eachChatRef.collection("messages");
          messagesRef.onSnapshot(function(snapshot) {
              snapshot.docChanges().forEach(function(messageDoc) {
                  // Do whatever
              });
          });
      });
    });
    

答案 1 :(得分:1)

查看CollectionGroups的文档-将您的侦听器设置为.collectionGroup(“ messages”)-您将必须处理所有“ chats”文档的 all 所做的更改。 (提示:每个返回的消息DocRef都包含refPath字段-您可以对其进行简单的分析以找到“父”聊天文档的路径)