MongoDB:如何查询或仅包含具有特定属性值的嵌入文档的容器文档?

时间:2011-10-17 15:25:50

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

好的,让我试着解释一下我想要实现的目标......

假设我有一个嵌入ROOMS的集合HOUSE。每个房子都有很多房间。 假设每个房间都有颜色属性(蓝色,红色,绿色等)

现在,如果我想要检索所有房间颜色为蓝色的房屋,我可以继续进行,例如

House.where(:'rooms.color' => :blue)

然而,我真正想要的是查询所有只有蓝色房间的房子。并且我不知道该怎么做...我可以在HOUSE级别创建一个新属性来“标记”如果房间都是相同的颜色......但我宁愿避免,如果我可以,因为我的需要升级当前数据集以反映这一点。

谢谢,

亚历

3 个答案:

答案 0 :(得分:0)

你试过吗?

House.only(:'rooms.color' => :blue)

答案 1 :(得分:0)

退后一步思考......我实际上是以错误的方式去做,有时你必须否定:)

基本上有一个只有蓝色房间的房子,意味着这个房子没有其他颜色的房间......

想象我有一组有限的可能颜色,如:红色:绿色:蓝色然后为了找到只有蓝色房间的房子,我只需找到没有房子:红色或绿色的房间:)

House.where(:'rooms.color'.nin => [:red, :green]) 

应该做的伎俩:)

亚历

答案 2 :(得分:0)

@Alex你更好地判断你的数据集,但理论上也应该这样做。

house_ids = House.where("rooms.color" => :blue).only(:_id).map(&:_id)
unwanted_house_ids = House.where("rooms.color".to_sym.ne => :blue).only(:_id).map(&:_id)
houses_with_only_blue_rooms = House.all.for_ids(house_ids - unwanted_house_ids)