我有一个非常常见的用例 - 评论列表。每个评论都有一个作者。
我使用引用存储评论中对作者的引用,因为作者可以发表多个评论。
现在我正在使用 ReactiveMongo 并希望尝试保持数据库访问异步,但在这种情况下,我不知道如何做。我对数据库进行异步访问,以获取评论,但是对于每个评论,我都必须获取作者,到目前为止我知道的唯一方法是循环访问评论并同步获取用户:
val userOption:Option[JsObject] = Await.result(usersCollection.find(Json.obj("id" -> userId).one[JsObject], timeout)
//...
除此之外,我还可以:
异步获取每个用户,但随后我必须引入一些功能来等待所有用户都被获取,以便返回响应,而我的代码可能会变得一团糟。
存储完整的用户对象 - 至少是我在每个评论中评论所需的对象(图片、名称等)。这种冗余可能会变得管理起来很麻烦,因为每次用户更改某些内容(与评论中存储的数据相关)时,我都必须遍历数据库中的所有评论并进行修改。
此处应用的正确模式是什么?
最佳答案
我不久前解决了这个问题。
mongo 中没有连接。 您必须手动处理连接。
您的选择是:
- 循环遍历每个评论条目并为用户查询 mongo。这就是你正在做的事情。
- 从评论中获取所有用户 ID,在 mongo 中查询与这些 ID 匹配的用户,然后注意将用户与评论进行匹配。这正是您所做的,但做了一些优化。
- 将用户嵌入评论中或将评论嵌入用户中。不推荐这样做,这可能不是评论/用户的正确位置。
- 考虑在显示评论时需要用户提供哪组数据,然后在评论中嵌入这些信息
我最终选择了最后一个选项。
我们在每条评论中嵌入了用户 ID、名字和姓氏。
此信息不太可能更改(甚至可能在创建后不允许更改?)。
如果它可以改变,那么定制 update-user 方法来用新信息更新相关评论并不太难(我们也这样做了)。
所以现在不需要加入。
关于mongodb - 在 Mongo/RectiveMongo 中存储/获取列表引用的值的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491334/