Mongo发现者和标准

时间:2011-12-09 13:12:31

标签: ruby-on-rails-3 mongodb mongoid

我在带有Mongoid映射器的rails应用程序中使用MongoDB。但我不理解查询的finderscriteria。例如,在mongoid文档中,Finders部分是查询Model.all,但如果我使用它(例如User.all),则控制台返回条件而不是结果:

 => #<Mongoid::Criteria
  selector: {},
  options:  {},
  class:    User,
  embedded: false>

但是如果我使用finder Model.firstModel.last,控制台会返回特定结果。 (User.first返回特定用户及其字段,:email:username和其他用户)。为什么Model.all在文档中写为finders?如果我需要获取所有Users或例如Posts,我需要做什么?

1 个答案:

答案 0 :(得分:9)

您可以将条件对象视为数组。 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

无论何时使用Criteria中未定义的任何方法,mongoid都会实际运行查询并获取结果并将其视为数组。如果您特别希望将结果作为数组返回,则可以随时调用User.all.to_a。但请记住,以下两个大致相同:

User.all.each {|u| puts u.id}
User.all.to_a.each {|u| puts u.id}

但是后者存在一个问题,它将获取内存中的所有文档一次,并且可能导致过多的内存消耗。但是,第一个使用Mongodb游标来完成并且仅加载由游标产生的文档,意味着受控的内存使用。