0

Rails アプリのデータベースとして Mongoid を使用しています。ログに QUERY 行が多すぎることに気付き、調べてみることにしました。

コードの一部は次のとおりです。

<%= if movie.directors.first
... Do something ...                  
end %>

このため、ログには 2 つのクエリが表示されました

 MOPED: 127.0.0.1:27017 QUERY        database=tgmd-wiki collection=directors selector={"$query"=>{"$and"=>[{"_id"=>{"$in"=>["510a097b53c205c294000163"]}}]}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.7060ms)
  MOPED: 127.0.0.1:27017 QUERY        database=tgmd-wiki collection=directors selector={"$query"=>{"$and"=>[{"_id"=>{"$in"=>["510a097b53c205c294000163"]}}]}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.4706ms)

私がそれを読むように変更したとき:

<%= if movie.directors[0]
... Do something ...                  
end %>

クエリは 1 つだけでした。

MOPED: 127.0.0.1:27017 QUERY        database=tgmd-wiki collection=directors selector={"$and"=>[{"_id"=>{"$in"=>["510a097b53c205c294000163"]}}]} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.7353ms)

最初のメソッドが再クエリを実行するのはなぜですか? 私のコードにはそのようなクエリがたくさんあるので、これをわずか 0.4 ミリ秒の差として見過ごすことはできません。

洞察はありますか?

4

1 に答える 1

1

理由はわかりませんが、.first は、Rails 自体ではなく、mongoid に関連しています。

補足として、実行する方がおそらく高速であるか、少なくともクリーンです。

if movie.directors.any?
  ...
end

そしてもちろん、最初のクエリを取得しないように、ディレクターを熱心にロードします。

于 2013-02-03T15:52:58.487 に答える