Eug*_*ene 2 mongodb mongoid ruby-on-rails-3
我在带有Mongoid映射器的rails应用程序中使用MongoDB.但我不明白finders和criteria查询.例如,mongoid documentaion中的section Finders是查询Model.all,但如果我使用它(例如User.all),控制台返回条件而不是结果:
=> #<Mongoid::Criteria
selector: {},
options: {},
class: User,
embedded: false>
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用finder Model.first或Model.last,控制台返回特定结果.(User.first返回特定用户,以其字段,:email,:username和其它).为什么Model.all在文档中写道finders?如果我需要全部Users或者例如,我需要做什么Posts?
您可以将条件对象视为数组.Finders返回一个标准对象,因为标准可以在mongoid中链接.也就是说,你可以这样做:
users = User.where(:activated => true)
users = users.where(:created_at.gte => Time.now - 1.week) unless params[:recent].blank?
users = users.where(:gender => params[:gender].downcase) if %w[m f].include?(params[:gender].downcase
Run Code Online (Sandbox Code Playgroud)
无论何时使用任何未定义的方法Criteria,mongoid都会实际运行查询并获取结果并将它们视为数组.如果您特别希望将结果作为数组返回,则可以随时调用User.all.to_a.但请记住,以下两个大致相当:
User.all.each {|u| puts u.id}
User.all.to_a.each {|u| puts u.id}
Run Code Online (Sandbox Code Playgroud)
但是后者存在一个问题,它将获取内存中的所有文档一次,并且可能导致过多的内存消耗.但是,第一个使用Mongodb游标来完成并且仅加载由游标产生的文档,意味着受控的内存使用.