2

我有一个很常见的用例——评论列表。每条评论都有一个作者。

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

现在我正在使用 ReactiveMongo 并想尝试保持数据库访问异步,但在这种情况下,我不知道如何。我对数据库进行异步访问以获取评论,但是对于每条评论我都必须获取作者,直到现在我知道的唯一方法是遍历评论并同步获取用户:

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

除此之外,我可以:

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

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

在这里应用的正确模式是什么?

4

1 回答 1

2

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

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

您的选择是:

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

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

于 2013-09-12T10:56:02.837 回答