Mongoid在嵌入文档上交叉标准

时间:2012-09-22 02:50:38

标签: mongodb mongoid mongoid3

我正在尝试使用Mongoid 3在某些嵌入式文档中获取两个查询的交集。

所以(假的例子)想象我有:

class Post
  embeds_many :comments

  index 'comments.author_id' => 1
end

class Comments
  embedded_in :post
  belongs_to :author
end

如果我想收到用户发表评论的帖子,我可以这样做

Post.where(:'comments.author_id' => User.first.id)

但是,如果我想获得这两个用户都有评论的帖子怎么办?

u1 = User.first.id
u2 = User.last.id
Post.where(:'comments.author_id' => u1.id, :'comments.author_id' => u2.id)

这在mongoid 3中不起作用。它用第二个覆盖了第一个comments.author_id,所以你得到这样的东西:

command={:count=>"posts", :query=>{"comments.author_id"=>"505d1eb5f8182b7082000017"}}

我试过的其他变种没有任何运气:

Post.where(:'comments.author_id' => u1.id).where(:'comments.author_id' => u2.id)
Post.where(:'comments.author_id' => u1.id).and.where(:'comments.author_id' => u2.id)
Post.where(:'comments.author_id' => u1.id).intersect.where(:'comments.author_id' => u2.id)
Post.all_of(:'comments.author_id' => u1.id, :'comments.author_id' => u2.id)

有没有更好的方法来构建此查询?谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是,通过示例Mongoid没有机会对它做任何事情,因为你提供了一个Ruby哈希,在执行方法之前,它被评估为只有一个键(因为键是相同的):

Post.where(:'comments.author_id'=> u1.id,:'comments.author_id'=> u2.id)

您想要做的是:

Post.any_in(:'comments.author_id'=> [u1.id,u2.id])