Как правило, вставлять следующие / сопровождаемые отношения в пользовательские документы по нескольким причинам плохая идея:
(1) максимальный размер документа составляет 16 МБ, и вполне вероятно, чтопопулярный пользователь хорошо подписанного сайта может получить сотни тысяч подписчиков, которые приблизятся к максимальному размеру документа,
(2) отношения подписчиков часто меняются, и поэтому случай, когда пользователь получает многоподписчиков переводится в повторный рост документа, если вы встраиваете подписчиков.Частый рост документов значительно снизит производительность MongoDB, и поэтому его следует избегать (случайный рост документов, особенно если документы имеют тенденцию достигать стабильного конечного размера, меньше потери производительности).
Так что да, это такЛучше всего разбить следующее / сопровождаемое отношение на отдельную коллекцию записей, каждая из которых имеет два поля, например, {_id:, oid:}, с индексами _id (для запроса «за кем я следую?») и oid (для запроса «кто следует за мной?»).Любое отдельное изменение состояния моделируется добавлением или удалением одного документа, хотя, если вы также отображаете такие вещи, как число подписчиков, вам, вероятно, следует сохранять отдельные счетчики, которые вы обновляете после любой вставки / удаления ребра.
(OfКонечно, это предполагает, что ваши бизнес-требования позволят вам проявить некоторую гибкость в деталях согласованности: в общем, если ваш код дисплея сообщает пользователю, что у него 304 подписчика, а затем переходит к их перечислению, только самый привередливый пользователь будет проверять, что подписчики подсчитывают додо 304. Если бизнес-требования требуют абсолютной согласованности, вам понадобится база данных, которая изолирует транзакции для вас, или вам придется подсчитывать себя как часть отображения всех идентификаторов пользователей.)