mongodb - 在 Mongo/RectiveMongo 中存储/获取列表引用的值的最佳方式?

标签 mongodb reference playframework-2.1 redundancy reactivemongo

我有一个非常常见的用例 - 评论列表。每个评论都有一个作者。

我使用引用存储评论中对作者的引用,因为作者可以发表多个评论。

现在我正在使用 ReactiveMongo 并希望尝试保持数据库访问异步,但在这种情况下,我不知道如何做。我对数据库进行异步访问,以获取评论,但是对于每个评论,我都必须获取作者,到目前为止我知道的唯一方法是循环访问评论并同步获取用户:

val userOption:Option[JsObject] = Await.result(usersCollection.find(Json.obj("id" -> userId).one[JsObject], timeout)
//...

除此之外,我还可以:

  • 异步获取每个用户,但随后我必须引入一些功能来等待所有用户都被获取,以便返回响应,而我的代码可能会变得一团糟。

  • 存储完整的用户对象 - 至少是我在每个评论中评论所需的对象(图片、名称等)。这种冗余可能会变得管理起来很麻烦,因为每次用户更改某些内容(与评论中存储的数据相关)时,我都必须遍历数据库中的所有评论并进行修改。

此处应用的正确模式是什么?

最佳答案

我不久前解决了这个问题。

mongo 中没有连接。 您必须手动处理连接。

您的选择是:

  1. 循环遍历每个评论条目并为用户查询 mongo。这就是你正在做的事情。
  2. 从评论中获取所有用户 ID,在 mongo 中查询与这些 ID 匹配的用户,然后注意将用户与评论进行匹配。这正是您所做的,但做了一些优化。
  3. 将用户嵌入评论中或将评论嵌入用户中。不推荐这样做,这可能不是评论/用户的正确位置。
  4. 考虑在显示评论时需要用户提供哪组数据,然后在评论中嵌入这些信息

我最终选择了最后一个选项。
我们在每条评论中嵌入了用户 ID、名字和姓氏。 此信息不太可能更改(甚至可能在创建后不允许更改?)。
如果它可以改变,那么定制 update-user 方法来用新信息更新相关评论并不太难(我们也这样做了)。
所以现在不需要加入。

关于mongodb - 在 Mongo/RectiveMongo 中存储/获取列表引用的值的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491334/

相关文章:

spring - 使用 Reactive MongoDB 进行流式传输并且正在取消耗时操作

python - 在 python 中反转单链表...我想我误解了 python 如何处理引用

c# - 是否可以从 vb.net dll 中的 dll 导入 c# 类?

c++ - 仅更改 const-ness 的指针转换可以调用未定义的行为吗?

scala - 如何在Scala中将对象列表转换为两个字段的映射

java - Mongodb查询匹配以空格分隔的单词

mysql - MongoDB 相当于 MYSQL concat()

javascript - 如何将数据从 CSV 文件导入服务器端的 Meteor 集合

java - 将 &lt;script&gt; 添加到 <head> from Play Framework 2 中的 scala 模板标签

java - 玩框架 2.1.x 和 EbeanServer