2

我有一个相当常见的用例 - 评论列表。每条评论都有一位作者。存储/获取Mongo/RectiveMongo中的列表中引用的值的最佳方法是什么?

我使用引用将作者评论的参考文献存储在作者中,因为作者可以提出多个评论。

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

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

除此之外,我可以:

  • 获取每个用户异步但后来我就来介绍一些功能要等到所有的用户都牵强,为了返回响应,和我的代码有可能变得一团糟。

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

什么是适用于此的正确模式?

回答

2

我刚才解决了这个确切的问题。

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

的选项有:

  1. 循环每一个注释输入和查询蒙戈用户。这是你在做什么。
  2. 从评论中获取所有用户标识,查询与这些标识符匹配的用户的mongo,然后注意将用户与评论进行匹配。这只是您做了什么,但稍微优化了一些。
  3. 将用户嵌入到用户的评论或评论中。不会推荐这个,这可能不是评论/用户的正确位置。
  4. 想到了什么一组数据显示做注释,当你从用户的需要,并嵌入在评论

我结束了最后一个选项会只是这个信息。
我们在每条评论中嵌入了用户标识,名字和姓氏。 这个信息不太可能改变(创建后可能甚至不允许改变?)。
如果它可以改变,那么定制update-user方法来更新与新信息相关的注释并不难(我们也是这样做的)。
所以现在不需要连接。

+0

是的,我现在正在阅读4,现在我正在阅读“Mongo DB in action”(第2版),并且他们还建议(对于大多数情况)在评论中存储来自用户的必要数据。用户更改数据时的写入操作相当昂贵,但正如您所说的那样,这不是很频繁(图片我猜想有点多,但与查询评论相比仍然较低)。 – Ixx

+0

只是想补充一点,在1和2之间缺少一个选项。我不知道,因为我的初学者Scala知识 - 也可以使用'Future.sequence'比2.更差的方式异步执行查询,因为它仍然在做很多查询,但是优于1,因为它们不会阻塞。 – Ixx

相关问题