Вариант 1 выглядит так, как будто он, вероятно, приведет к чрезмерному росту и перемещению документов, что отрицательно скажется на производительности, поскольку большинство ваших записей будут идти во встроенный документ (Уведомления).
Вариант 2 Я не совсем понимаю вашу стратегию - кажется, что эти 3 коллекции избыточны, но также встраивают список уведомлений по objectId, если вы уже ссылаетесь на пользователя по идентификатору в таблице уведомлений.Вы можете индексировать пользователя в таблице уведомлений, а затем исключить вложенный массив в таблице пользователей.
(РЕДАКТИРОВАТЬ) Вот еще одна стратегия, которую следует рассмотреть.
Три коллекции, которые выглядят следующим образом:
Users:
_id: objectid
username : string
name: string
Notifications:
_id: objectid
to (indexed): objectid referencing _id in "users" collection
read: boolean
Global Notifications:
_id: objectid
read_by: [objectid referencing _id in users]
Для уведомлений, предназначенных для одного пользователя, вставьте в Уведомления для этого пользователя.Для нескольких пользователей вставьте по одному для каждого пользователя (альтернативно, вы можете сделать поле «to» массивом и сохранить _ids всех получателей, а затем вести еще один список всех получателей, которые его прочитали).Чтобы отправить уведомление всем пользователям, вставьте в коллекцию глобальных уведомлений.Когда пользователь читает его, добавьте _id своего пользователя в поле read_by.Таким образом, чтобы получить список всех непрочитанных уведомлений пользователя, вы делаете два запроса: один к уведомлениям, а другой к глобальным уведомлениям.