1

我可能在这里遗漏了一些东西,但这似乎是一个性能疏忽。当我查看Errbit的查询日志并注意到针对相同对象的数百个查询时,我首先注意到了这一点。

似乎关系的所有子项在has_many通过关系加载后都没有对其父对象的引用。即访问parent.children.map &:parent将每次从数据库中获取父级,child而不是使用内存中的副本进行设置parent

例子:

使用非常简单的belongs_to/has_many设置:

class Person
  include Mongoid::Document
  field :name
  has_many :posts, :inverse_of => :person
end

class Post
  include Mongoid::Document
  field :text
  belongs_to :person, :inverse_of => :posts
end

然后,在 Rails 控制台中,进行一个简单的演示:

Loading development environment (Rails 3.2.12)
[1] pry(main)> tom = Person.create(:name => 'Tom')
[2] pry(main)> tom.posts.create(:text => 'stuff')
[3] pry(main)> tom.posts.create(:text => 'other stuff')
[4] pry(main)> Person.first.posts.map {|post| post.person.object_id}
=> [50687740, 50719060]

注意最后一行,每个person引用指向不同的 ruby​​ 对象。我使用 ruby​​ 的object_id属性来强调这些实际上是不同的对象这一事实,这需要两次往返数据库。

为什么通过 has_many 关系加载后,父关系不只是对父对象的引用?

4

1 回答 1

0

事实证明这是一个已知的缺陷,并且计划在 4.0 版中添加此功能。

同时,您可以通过启用Mongoid Identity Map大幅减少重复查询并提高性能

于 2013-03-11T01:39:51.533 回答