在mongoid中查询和排序嵌入文档

时间:2012-05-24 09:35:31

标签: ruby mongodb mongoid

我有三个班级

class Post
 include Mongoid::Document
 include Mongoid::Timestamps
 belongs_to :user, :inverse_of => nil
 embeds_many :comments, :as => :commentable
 field :content, :type => String
end

class Commment
  include Mongoid::Document
  include Mongoid::Timestamps
  belongs_to :user, :inverse_of => nil
  embedded_in :commentable, :polymoriphic => true
end

class User
  has_many :posts, :dependent => :destroy
  field :name, :type => String
end

每当用户创建新评论时,我想将其内容与用户所做的最新评论进行比较。这是我的代码,用于获取用户的最新评论:

comments_user=[]
Post.where("comments.user_id" => user.id).
     only(:comments).
     each {|p| comments_user += p.comments.where(:user_id => user.id).to_a}
latest_comment = comments_user.sort_by{|comment| comment[:updated_at]}.reverse.first 

上面的代码给出了结果,但所采用的方法效率不高,因为我必须遍历用户已经提交的所有帖子以查找最新评论。如果有的话,任何人都可以为我提供更有效的解决方案吗? 简单来说,我有没有办法得到这个用户的所有评论?

2 个答案:

答案 0 :(得分:5)

这应该获取最新用户的评论:

Post.where("comments.user_id" => user.id).order_by(:'comments.updated_at'.desc).limit(1).only(:comments).first

答案 1 :(得分:3)

这是嵌入的标准问题。它极大地改进了一些查询(“加载帖子及其所有评论”),但使其他人无效/不切实际(“找到用户的最新评论”)。

我在这里看到两个选项:

  • 继续嵌入和复制数据。也就是说,当用户发表评论时,将此评论嵌入到帖子文档和用户文档中。当然,这种数据重复有其缺点(如果您需要编辑注释,该怎么办?);

  • 停止嵌入并开始引用。这意味着评论现在是顶级实体。您无法快速加载包含评论的帖子,因为没有联接。但其他查询现在更快,并且没有数据重复。