Firebase实时数据库,如果用户是对话的一部分,则为child_changed

时间:2018-11-01 21:14:10

标签: javascript firebase firebase-realtime-database

这是我的数据库结构: enter image description here

我希望新消息生成通知。 我如何查询此数据以确保成员是对话的一部分,然后仅传递新消息的child_add。

这是我到目前为止的内容,但是添加一条消息后,它将返回整个对话。

const notificationChecker = database.ref("chats")
    .orderByChild(`members/${userId}`)
    .equalTo(true);

notificationChecker.on('child_changed', snapshot => {

  console.log(snapshot.val());

});

1 个答案:

答案 0 :(得分:1)

由于您正在听chats,因此查询结果将是子节点chats。无法更改这种行为,这是经验丰富的Firebasers建议为应用程序中每种实体类型使用单独的顶级列表的众多原因之一。

似乎您希望在当前用户所参与的所有对话中为他们提供新消息。这是一个三步过程:

  1. 确定当前用户
  2. 查找他们参与的对话。

    通常,您将通过使用单独的顶级列表user-conversations,然后在其下将UID作为键,并在其下将会话ID作为键(值为true)来进行此操作。参见https://stackoverflow.com/a/41528908/209103

  3. 在每个对话中查找新消息。

    执行此操作的最佳方法是了解用户在每次对话中看到的最后一条消息。在线性聊天应用中,您可以通过存储用户在/user-conversations/$uid/$conversationid下看到的最后一个聊天消息的密钥(而不是我们上面使用的true)来对此建模。

    如果不可能,则只需为每个对话(conversationRef.orderByKey().limitToLast(1))加载最新消息,然后从那里开始收听(conversationRef.orderByKey().startAt(keyOfLatestMessage))。

    无论哪种方式,您都需要针对用户所属的每个会话进行此操作。