Лучший способ сохранить / получить значения, на которые ссылается список в Mongo / RectiveMongo?
У меня есть довольно распространенный вариант использования - Список комментариев. У каждого комментария есть автор.
Я сохраняю ссылку из комментария к автору, используя ссылку, так как автор может сделать несколько комментариев.
Теперь я работаю с ReactiveMongo и хочу попытаться сохранить доступ к базе данных асинхронным, но в этом случае я не знаю, как это сделать. Я делаю асинхронный доступ к базе данных, чтобы получить комментарии, но затем для каждого комментария я должен получить автора, и до сих пор единственный способ, который я знаю, - это перебирать комментарии и получать пользователя синхронно:val userOption:Option[JsObject] = Await.result(usersCollection.find(Json.obj("id" -> userId).one[JsObject], timeout)
//...
Кроме этого, я мог бы:
-
Получить каждого пользователя асинхронно, но затем я должен ввести некоторую функциональность, чтобы ждать, пока все пользователи будут извлечены, чтобы вернуть ответ, и мой код, вероятно, станет беспорядком.
-
Храните полный пользовательский объект - по крайней мере, то, что мне нужно для комментария (изображение, имя и т. д.) В каждом комментарии. Эта избыточность может стать управлять им было сложно, так как каждый раз, когда пользователь что-то изменял (относящееся к данным, хранящимся в комментариях), мне приходилось просматривать все комментарии в базе данных и изменять их.
Каков правильный шаблон для применения здесь?
1 ответ:
Я решил эту проблему некоторое время назад.
В mongo нет соединений. Вы должны вручную позаботиться о соединении.
Ваши варианты:
- цикл через каждую запись комментария и запрос mongo для пользователя. вот что ты делаешь.
- получите все идентификаторы пользователей из комментариев, запросите mongo для пользователей, соответствующих этим идентификаторам, а затем позаботьтесь о том, чтобы сопоставить пользователя с комментарием.Это именно то, что вы сделали, но немного более оптимизировано.
- встраивать пользователя в комментарии или комментарии пользователей. Не рекомендую это, это, вероятно, не самое подходящее место для комментариев/пользователей.
- Подумайте, какой набор данных вам нужен от пользователя при отображении комментария, и добавьте только эту информацию в комментарий
В итоге я выбрал последний вариант.
Мы ввели идентификатор пользователя, имя и фамилию в каждый комментарий. Эта информация вряд ли изменится (возможно, даже не будет изменена после создания?).
Если он может измениться, то это не слишком трудно адаптировать update-пользовательский метод обновления связанных комментариев с новой информацией (мы тоже это сделали).
Так что теперь никакого соединения не требуется.