Эта проблема состоит из двух частей:
- Подсчет количества сообщений
- Отслеживание прочитанного пользователем
Подсчет количества сообщений
Если вы используете базу данных Firebase Realtime или Cloud Firestore, есть два типичных подхода к подсчету:
- Загрузить непрочитанные сообщения и сосчитать их на стороне клиента.
- Храните счетчик сообщений в базе данных и обновляйте его каждый раз, когда вы читаете / пишете сообщение.
Подсчет сообщений на стороне клиента проще всего реализовать, поэтому обычно начинаются неопытные разработчики. Когда количество сообщений мало, это прекрасно работает. Но с ростом количества сообщений вы будете загружать все больше и больше данных.
В этот момент вы переключитесь на , сохраняя счетчик в базе данных и обновляя его при каждой операции записи / удаления. Это дублирует данные, поэтому разработчики, имеющие опыт работы с реляционными базами данных, обычно сталкиваются с такими проблемами. Но это самый распространенный подход.
Вы можете обновить счетчик на стороне клиента или использовать подход на стороне сервера, такой как этот пример поддержки счетчиков в облачных функциях .
Отслеживание прочитанного пользователем
Чтобы узнать, сколько непрочитанных сообщений имеет пользователь, вам нужно знать, что пользователь уже прочитал. Здесь снова есть два общих подхода:
- Отслеживание каждого отдельного сообщения, прочитанного пользователем.
- Отслеживание идентификатора самого последнего сообщения, прочитанного пользователем.
Отслеживание отдельных сообщений звучит наиболее правильно, поэтому я вижу, что это делается много. Я также вижу, что разработчики борются с этим, так как это требует большого бухгалтерского учета. Это определенно возможно, но я бы рекомендовал начать с более простого подхода ...
Приложения чата имеют дело с (хронологическими) последовательностями сообщений. Если вы знаете идентификатор последнего сообщения, которое пользователь видел , вы можете предположить, что пользователь также видел все сообщения, которые старше этого.
Скажите, что я отслеживаю метку времени последнего прочитанного вами сообщения, и оно 1535725374298
. Теперь я могу запросить в чате только те сообщения, которые были новее:
firebase.database()
.ref("chat")
.child(chatId)
.orderByChild("timestamp")
.startAt(1535725374298)