база данных реального времени firebase, child_changed, если пользователь участвует в разговоре - PullRequest
0 голосов
/ 02 ноября 2018

Это моя структура базы данных: enter image description here

Я хочу, чтобы новые сообщения генерировали уведомления. Как мне запросить эти данные, чтобы убедиться, что участник является частью диалога, а затем передать только child_added нового сообщения.

Это то, что у меня есть, но оно вернет весь разговор при добавлении сообщения.

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

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

  console.log(snapshot.val());

});

1 Ответ

0 голосов
/ 02 ноября 2018

Поскольку вы прослушиваете 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)).

    В любом случае вам нужно будет делать это для каждого разговора, частью которого является пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...