1

ここで何かが足りない可能性がありますが、これはパフォーマンスの見落としのようです。Errbitのクエリログを見て、同じオブジェクトに対する何百ものクエリに気付いたとき、私は最初にこれに気づきました。

リレーションのすべての子は、has_manyリレーションを介してロードされた後、親オブジェクトへの参照を持っていないようです。つまり、アクセスすると、メモリ内のコピーで設定されるのではなくparent.children.map &:parent、DBから親が1回ずつ取得されます。childparent

例:

非常にシンプルな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属性を使用して、これらが文字通り異なるオブジェクトであり、データベースへの2回のラウンドトリップが必要であるという事実を強調しています。

has_manyリレーションを介してロードした後、親リレーションが親オブジェクトへの単なる参照ではないのはなぜですか?

4

1 に答える 1

0

これは既知の欠陥であり、この機能の追加はバージョン 4.0で計画されています。

それまでの間、Mongoid ID マップを有効にすることで、重複するクエリを大幅に減らし、パフォーマンスを向上させることができます。

于 2013-03-11T01:39:51.533 に答える