Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript firebase实时数据库,如果用户是对话的一部分,则更改子项_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript firebase实时数据库,如果用户是对话的一部分,则更改子项

Javascript firebase实时数据库,如果用户是对话的一部分,则更改子项,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,这是我的数据库结构: 我希望新邮件生成通知。 如何查询此数据以确保成员是对话的一部分,然后只传递新消息中添加的子消息 这是我到目前为止所做的,但当添加消息时,它将返回整个对话 const notificationChecker = database.ref("chats") .orderByChild(`members/${userId}`) .equalTo(true); notificationChecker.on('child_changed', snapshot =&

这是我的数据库结构:

我希望新邮件生成通知。 如何查询此数据以确保成员是对话的一部分,然后只传递新消息中添加的子消息

这是我到目前为止所做的,但当添加消息时,它将返回整个对话

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

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

  console.log(snapshot.val());

});

由于您正在收听
聊天
,因此查询的结果将是子节点
聊天
。没有办法改变这种行为,这也是为什么有经验的Firebaser建议为应用程序中的每种实体类型使用单独的顶级列表的众多原因之一

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

  • 确定当前用户
  • 找到他们参与的对话

    通常情况下,您可以使用一个单独的顶级列表
    用户对话
    ,然后将UID作为该列表下的键,将对话ID作为该列表下的键(值为
    true
    )。看

  • 在每个对话中查找新消息

    最好的方法是知道用户在每次对话中看到的最后一条消息是什么。在线性聊天应用程序中,您可以通过将用户看到的最后一条聊天消息的密钥存储在
    /user conversations/$uid/$conversationid
    下,而不是我们上面使用的
    true
    来建模

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

    无论哪种方式,您都需要为用户参与的每个会话执行此操作


  • 谢谢你的帮助!我要四处玩玩,看看能想出什么主意。