mongoid - 查询嵌入式文档

时间:2014-07-15 03:17:50

标签: ruby-on-rails mongodb mongoid

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

1 个答案:

答案 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#findArray#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:嵌入一些元数据或聚合是一种优化,最好保留在你真正需要它的时候