0

我使用 Mongoid 作为我的 Rails 应用程序的数据库。注意到日志中有太多 QUERY 行,我决定看一看。

部分代码如下:

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

为此,日志显示了两个查询

 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 %>

只有一个查询。

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 将与 mongoid 相关,而不是 Rails 本身。

附带说明一下,这样做可能会更快,或者至少更清洁

if movie.directors.any?
  ...
end

当然,急切地加载你的导演,所以你甚至不会得到第一个查询。

于 2013-02-03T15:52:58.487 回答