我已经尝试了一段时间了,我得出的结论是它一定是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
有什么想法吗?
答案 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”