0

我正在尝试使用 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 覆盖第一个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)

有没有更好的方法来构造这个查询?谢谢!

4

1 回答 1

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 ])

于 2012-09-22T15:13:58.710 回答