class Foo
include Mongoid::Document
field :name, type: String
embeds_many :bars
end
class Bar
include Mongoid::Document
field :name, type: String
embedded_in :foo
end
有没有办法可以在这里查询所有bars
?在AR中,我会执行类似Bar.where(name: 'something')
的操作 - 只需向我提供符合某些条件的所有条形码。
就目前而言,我只能查询单个foo上的特定条形图。 `Foo.first.bars.where(名字:'东西')。我知道mongoDB没有加入,所以......我很好奇如何解决这个问题。
我准备好一起失去Foo并做类似的事情:
class Bar
include Mongoid::Document
field :foo_name, type: String
field :name, type: String
end
答案 0 :(得分:10)
如果没有先返回嵌入的Bar
对象,则无法返回Foo
个对象。
您可以查询顶级文档(Foo
)作为嵌入文档的匹配项。
foo = Foo.create(:name => 'foo1')
foo.bars << Bar.new(:name => 'bar1')
Foo.where(:'bars.name' => 'bar1').first
=> #<Foo _id: 53c4a380626e6f813d000000, name: "foo1">
然后,当您的Foos与某个嵌入式栏相匹配时,您可以使用其他查询找到要查找的栏(只需映射到Array#find
或Array#select
foo.bars << Bar.new(:name => 'bar2')
Foo.where(:'bars.name' => 'bar1').first.bars.where(:name => 'bar2').first
=> #<Bar _id: 53c4a380626e6f813d000001, name: "bar2">
更新: 如果您要查询父文档上下文中的嵌入式文档,我建议不要使用嵌入式文档。当您嵌入文档时,您说&#34;我不打算将文档存在于其自己的文档中。如果你发现自己直接查询它,那么就放弃嵌入。嵌入很有诱惑力,但通常你不需要/需要它。
注意:我已经解嵌了100M +条目,这是一个漫长的过程。
注意2:嵌入一些元数据或聚合是一种优化,最好保留在你真正需要它的时候