Rails 3:使用$ in查询子文档时的MongoDB错误(查询根文档时工作)

时间:2011-11-18 04:15:58

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

我已经尝试了一段时间了,我得出的结论是它一定是mongo驱动程序中的一个错误或其他东西,但对我来说没有任何意义。

型号:

class Container
  include Mongoid::Document

  embeds_many :subs

  ...
end

class Sub
  include Mongoid::Document

  embedded_in :container

  references_and_referenced_in_many :stuffs

  ...
end

这允许我做这样的查询:

Container.where(:'subs.stuff_ids' => BSON::ObjectId('xxxx'))

Container.where(:'subs.stuff_ids'.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

所有这些都很好,并给出了正确的结果。

这意味着这些查询应该允许我访问匹配的子文档:

Container.subs.where(:stuff_ids => BSON::ObjectId('xxxx'))

=> Works,返回正确的子列表

BUT

Container.subs.where(:stuff_ids.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

=>总是返回0个子...这没有任何意义,因为“容器”上的相同查询返回一个具有子匹配的容器的正确列表,但查询给定“容器”的子服务器永远不能使用“$ in”

PS:

这是:Rails 3.0.10,Mongoid 2.2.0和Mongo Driver:1.4.0

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

mongodb& amp;它的司机。这就是它的设计工作方式

   db.container.find({'subs.stuffids : {$in : [xx,yyy]}'})

这相当于

  Container.where(:'subs.stuff_ids'.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

但是

Container.subs.where(:stuff_ids.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

您正在查询嵌入式文档作为普通文档。这是完全错误的,如果您定义关系has_many而不是embeds_many,这将正常工作。因为has_many将subs存储在单独的文档中,并在其他文档中添加引用ID关系外键。

答案 1 :(得分:0)

Nick Hoffman对Mongoid Google Group的回答(http://groups.google.com/group/mongoid/browse_thread/thread/9e07de1f3f04d1ef)

它适用于2.3.3,所以我建议从2.2.0升级:

class Parent 
  include Mongoid::Document 

  embeds_many :children 
end 

class Child 
  include Mongoid::Document 

  embedded_in :parent 

  has_and_belongs_to_many :others, :inverse_of => nil 
end 

class Other 
  include Mongoid::Document 
end 

Parent.delete_all 
Other.delete_all 

o1 = Other.create 
o2 = Other.create 
p = Parent.new 
p.children.new :others => [o1] 
p.children.new 
p.children.new :others => [o1, o2] 
p.save 

Parent.first.children.where(:other_ids.in => [o1.id, o2.id]).count 
=> 1 

要求'mongoid / version' Mongoid :: VERSION => “2.3.3”