【问题标题】:Get data from two collections mongoid从两个集合中获取数据 mongoid
【发布时间】:2011-12-10 11:53:00
【问题描述】:

大家好,所有 MongoDB/Mongoid 粉丝!

我的架构设计有一个小问题。

目前我有三个模型,UserPostCommentUser <- has_many -> PostsPost <- belongs_to -> UserPost <- has_many -> CommentsComment <- belongs_to -> Post, User

现在我需要列出一个包含所有帖子和 cmets 的提要,包括 User 对象。想想包括 cmets 在内的 Twitter 时间线。评论需要同时加载相关的帖子、帖子用户和评论用户对象。

这是否可以使用 Mongo 和 Mongoid 或者我需要更改我的架构设计?如果有,有什么想法吗?

谢谢,托拜厄斯

【问题讨论】:

  • 如果你有Post,你不能用@post.user@post.comments获取用户和cmets吗?
  • 我需要根据 created_at 创建时间线。 Post 和 cmets 应该在列表中混合使用。

标签: mongodb ruby-on-rails-3.1 mongoid


【解决方案1】:

为了正确扩展您的架构,我将执行以下操作;同时提供了一个相当简单的文档结构。我会在一个文档中包含一个帖子,其中包含您需要的所有必需信息,并执行以下操作:

帖子表:

{
   _id: mongoId,
   author_name:'Tobias',
   author_id: mongoId,
   post_content: 'hi this is my post',
   comments:[
       {
            "comment":"this is a comment",
            "user":"bob",
            "user_id":mongoId
       }, 

       {
            "comment":"this is a comment2",
            "user":"bob2",
            "user_id":mongoId
       }
   ]
  }

然后只需有一个 users 表,其中包含 id / name 和您可能想要的有关用户的任何其他信息。我选择非规范化 author_name / user 的原因是为了便于在视图层中表示这些数据。编写一个快速 map reduce 函数来遍历和更新帖子表中的名称(后端工作)要容易得多,然后必须执行多个查询来获取信息。拥有这个丰富的嵌入式架构将有助于为您生成快速页面。

所以我很清楚 author_name == user 和 author_id == user_id (只是不同的命名模式以阐明它主要用于您的应用程序端代码的位置。但这只是一个示例,您可以根据需要进行修改.

祝你好运!

【讨论】:

  • 这看起来很有趣!但是当用户更改他的名字时,我需要在嵌入式 cmets 中更新它们。您在谈论“地图减少功能”。你想更详细一点吗?谢谢
  • Sandelius,还请注意,您将在 mongoid 中使用 embeds_many、embedded_in 宏执行此操作。回复:map/reduce,你可能不需要那样做,一个简单的对帖子集合的更新查询很可能就足够了。
猜你喜欢
  • 2011-12-03
  • 2021-03-05
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多