我在带有Mongoid映射器的rails应用程序中使用MongoDB。但我不理解查询的finders
和criteria
。例如,在mongoid文档中,Finders
部分是查询Model.all
,但如果我使用它(例如User.all
),则控制台返回条件而不是结果:
=> #<Mongoid::Criteria
selector: {},
options: {},
class: User,
embedded: false>
但是如果我使用finder Model.first
或Model.last
,控制台会返回特定结果。 (User.first
返回特定用户及其字段,:email
,:username
和其他用户)。为什么Model.all
在文档中写为finders
?如果我需要获取所有Users
或例如Posts
,我需要做什么?
答案 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游标来完成并且仅加载由游标产生的文档,意味着受控的内存使用。