Mongoid在哪里使用count查询

时间:2012-11-15 16:41:16

标签: ruby-on-rails count mongoid where relation

我有下一个模型,使用Mongoid:

class Album
  have_many :images
end

class Image
  belongs_to :album
end

我想只获得包含任何图片的相册:

Album.all.select{ |a| a.images.count > 0 }

但它返回一个数组,我需要一个Mongoid :: Criteria。我尝试过使用类似的东西:

Album.where( "this.images.count > 0" )

并且它总是返回0个元素。 我该怎么做 ?

1 个答案:

答案 0 :(得分:1)

实际上,这不是一个数组,它是一个代理。 你可以查看日志,看看轻便摩托车正在为每张专辑调用.count funcion(在我的情况下是2)。

1.9.3-p194 :043 > Album.each { |a| a.images.count }
  MOPED: 127.0.0.1:27017 QUERY        database=mongo_benchmark collection=albums selector={} flags=[] limit=0 skip=0 fields=nil (0.7441ms)
  MOPED: 127.0.0.1:27017 COMMAND      database=mongo_benchmark command={:count=>"images", :query=>{"album_id"=>"50e36dd17c71c110ff000001"}} (0.5209ms)
  MOPED: 127.0.0.1:27017 COMMAND      database=mongo_benchmark command={:count=>"images", :query=>{"album_id"=>"50e36f8f7c71c110ff000004"}} (0.3800ms)

此外,如果您想获取Criteria对象,可以执行album.images.scoped

如果你有很多专辑,那么它将永远称为计数,这是不好的。我建议你在这种情况下使用计数器缓存。你可以使用我拥有的分支,包括计数器缓存到mongoid https://github.com/arthurnn/mongoid/tree/2215-counter_cache