Лучший способ сохранить / получить значения, на которые ссылается список в Mongo / RectiveMongo?


У меня есть довольно распространенный вариант использования - Список комментариев. У каждого комментария есть автор.

Я сохраняю ссылку из комментария к автору, используя ссылку, так как автор может сделать несколько комментариев.

Теперь я работаю с ReactiveMongo и хочу попытаться сохранить доступ к базе данных асинхронным, но в этом случае я не знаю, как это сделать. Я делаю асинхронный доступ к базе данных, чтобы получить комментарии, но затем для каждого комментария я должен получить автора, и до сих пор единственный способ, который я знаю, - это перебирать комментарии и получать пользователя синхронно:
val userOption:Option[JsObject] = Await.result(usersCollection.find(Json.obj("id" -> userId).one[JsObject], timeout)
//...

Кроме этого, я мог бы:

  • Получить каждого пользователя асинхронно, но затем я должен ввести некоторую функциональность, чтобы ждать, пока все пользователи будут извлечены, чтобы вернуть ответ, и мой код, вероятно, станет беспорядком.

  • Храните полный пользовательский объект - по крайней мере, то, что мне нужно для комментария (изображение, имя и т. д.) В каждом комментарии. Эта избыточность может стать управлять им было сложно, так как каждый раз, когда пользователь что-то изменял (относящееся к данным, хранящимся в комментариях), мне приходилось просматривать все комментарии в базе данных и изменять их.

Каков правильный шаблон для применения здесь?

1 2

1 ответ:

Я решил эту проблему некоторое время назад.

В mongo нет соединений. Вы должны вручную позаботиться о соединении.

Ваши варианты:

  1. цикл через каждую запись комментария и запрос mongo для пользователя. вот что ты делаешь.
  2. получите все идентификаторы пользователей из комментариев, запросите mongo для пользователей, соответствующих этим идентификаторам, а затем позаботьтесь о том, чтобы сопоставить пользователя с комментарием.Это именно то, что вы сделали, но немного более оптимизировано.
  3. встраивать пользователя в комментарии или комментарии пользователей. Не рекомендую это, это, вероятно, не самое подходящее место для комментариев/пользователей.
  4. Подумайте, какой набор данных вам нужен от пользователя при отображении комментария, и добавьте только эту информацию в комментарий

В итоге я выбрал последний вариант.
Мы ввели идентификатор пользователя, имя и фамилию в каждый комментарий. Эта информация вряд ли изменится (возможно, даже не будет изменена после создания?).
Если он может измениться, то это не слишком трудно адаптировать update-пользовательский метод обновления связанных комментариев с новой информацией (мы тоже это сделали).
Так что теперь никакого соединения не требуется.