Я создаю приложение для обмена сообщениями с socket.io, node, express, mon goose и mongodb. Я хотел бы отобразить количество непрочитанных сообщений, которые есть у пользователя (или хотя бы базовую c истину / ложь информации).
Моя стратегия проста:
Пользователь входит в систему и получает json с полезной информацией. Клиент React l oop через все свои сохраненные комнаты socket.io и сообщает серверу, что присоединяется к ним снова.
Все комнаты хранятся в виде отдельных документов, называемых Conversation
. Пользователь отслеживает все свои разговоры в своей собственной схеме благодаря свойству conversations
, в котором хранится идентификатор каждого Conversation
. (conversations: [{type: Schema.types.ObjectId, ref: "Conversation"}]
).
При отправке нового сообщения в комнате срабатывает функция socket.emit
. Сервер сохраняет новое сообщение в связанном документе Mon go Conversation
и, если все сделано успешно, отправляет сообщение всем членам комнаты. Так что есть сообщения в реальном времени + сохраненные сообщения.
А как насчет непрочитанных сообщений? Пользователи хотят получать уведомления в настоящее время. При сохранении нового сообщения в диалоге объект с именем latestMessage: {senderId: 123, messageSnippet: "hello...", read: false}
постоянно обновляется в документе Conversation
. Поэтому, когда пользователь проверяет свою панель сообщений, он может видеть свои непрочитанные сообщения (userId! == senderId && read: false ).
Когда пользователь нажимает на разговор, массив сообщений разговора отправляется сервером. Кроме того, свойство latestMessage
обновлено до {senderId: 123, messageSnippet: "hello...", read: true}
. Однако боюсь, что такая операция не очень оптимизирована (постоянно мутирует база данных ...). Есть ли лучший способ справиться с этим?
Последнее, но не менее важное: мне нужно обновить значок сообщения на панели навигации, чтобы сообщить пользователю, что у него есть новые непрочитанные сообщения. По сути, я хотел бы иметь такой же рендеринг, как Stackoverflow здесь. Как я могу сделать это эффективно?
Спасибо!