MongoDB дизайнерское решение для документов - PullRequest
0 голосов
/ 06 октября 2019

Я создаю API для небольшой социальной сети, и я столкнулся с дизайнерским решением, которое я должен принять. Я работаю с Express и MongoDB с mongoose для работы с базой данных.

У меня есть два документа: пользователи и сообщения. Я хочу, чтобы пользователи могли отмечать сообщения в качестве избранных. Я предложил два разных способа реализации:

Вариант A: сохранение избранного в пользовательском документе. Это позволяет легко показать все любимые сообщения пользователя. Но как бы я опрашивал пользователей, которые добавили в избранное определенную публикацию?

UserSchema:
   favorite_posts: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "posts"
      }
   ]

Вариант B: сохранение пользователей, которые нажимают кнопку избранного в почтовом документе. Преимущество заключается в том, что вы можете легко отображать всех пользователей, добавивших в избранное сообщение. Но как мне перечислить все сообщения, которые один конкретный пользователь отметил как избранные.

PostSchema:
   users_favorited: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "users"
      }
   ]

Может кто-нибудь объяснить мне, как запрашивать такие вещи? Я не становлюсь умнее из документации ...: (

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Если вы собираетесь делать много запросов по идентификатору пользователя, вы можете просто добавить столбец идентификатора пользователя в избранное. Это сохранит запросы / объединения / агрегаты

0 голосов
/ 07 октября 2019

Как уже упоминалось в комментариях, вашей лучшей ставкой была бы таблица соединений, чтобы заставить работать отношение: m. Mongoose эмулирует функциональность sql inner-join через функцию populate () в регулярных запросах или $ lookup-step в агрегации. Таким образом, в основном создайте таблицу с именем «лайки», которая содержит ссылки только на пользователя и сообщениеИспользуя структуру агрегации, вы можете легко запросить все лайки пользователя или всех лайков в сообщении, сначала используя оператор $ match, затем $ group для пользователя или поста и $ push для создания массива всех лайков. пользователя или наоборот, а затем присоедините необходимые данные к нему с помощью шага поиска $.

Однако, как вы описали, вы можете поместить все избранное в массив либо на пользователя, либо напост-документы, но если вы точно не знаете, что эти массивы не станут большими, я бы порекомендовал против этого, так как mongoDb не предназначен для такого использования, и вы очень быстро столкнетесь с проблемами производительности. Подробнее см. http://www.askasya.com/post/largeembeddedarrays/.

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