2010-12-06 68 views
3

我有一个名为广告模式,看起来像这样:Mongoid - 查询通过引用文档

class Ad 
    include Mongoid::Document 
    referenced_in :category 
end 

和类别型号:

class Category 
    include Mongoid::Document 
    referenced_in :domain 
    references_many :ads 
end 

如何选择广告的域名? 我试图使用Ad.where('category.domain_id' => domain.id)但这不起作用。

回答

6

问题是,MongoDB没有任何方法将Category记录映射到Ad记录。所有它知道的是Ad记录有一个category_id字段,所以'category.domain_id'将永远不会返回任何内容。查询内部的点符号仅适用于嵌入式文档,而不适用于引用(它们仍然是MongoDB中的二等公民)。

所以要解决你的问题,你需要2个疑问:

category_ids = Category.where(:domain_id => domain.id).map(&:_id) 
Ad.where(:category_id.in => category_ids) 
+0

是的,但我也需要得到类别的所有子类别(包括子子和子子子...) 。我使用MapReduce实现了它(在我尝试使用具有递归功能的ids集合之后)。 – 2010-12-07 13:44:10