Mongoid“标准”如何运作?

时间:2011-09-28 19:43:41

标签: ruby-on-rails mongodb mongoid

我正在尝试直接做一些事情,例如:

User.all(:criteria => {:project_id => 2})

这将返回Mongoid::Criteria

的实例

我可以用这个标准做什么?如果我只想返回文档数组以进行进一步评估,该怎么办?

3 个答案:

答案 0 :(得分:15)

在Mongoid中,标准代表查询,而不是元素。 您可以将条件视为过滤器,范围和查询对象。

一旦有了条件(范围),就可以使用一个应该迭代元素或返回一个元素的方法来获取元素,对数据库执行实际查询,例如:.first.last.to_a.each.map等。

这样效率更高,并且允许您从其他简单的“查询”中撰写复杂的“查询”。

例如,您可以在类中创建一些命名范围:

class User
  include Mongoid::Document
  field :name,  type: String
  field :age,   type: Integer
  field :admin, type: Boolean

  scope :admins, where(admin: true) # filter users that are admins
  scope :with_name, (name)-> { where(name: name) } # filter users with that name
end

然后你可以创建一些标准对象:

admins      = User.admins
johns       = User.with_name('John')
admin_johns = User.admins.with_name('John') # composition of criterias, is like doing ANDs
young       = User.where(:age.lt => 25) # the Mongoid method .where also returns a criteria

到目前为止,你没有触发任何查询到mongo数据库,你只是在撰写查询。

您可以随时保持链接标准,进一步优化查询:

young_admins = admins.merge(young)
old_admins = admins.where(age.gt => 60)

最后,使用元素获取Array:

# Execute the query and an array from the criteria
User.all.to_a
User.admins.to_a
admins.to_a
young_admins.to_a

# Execute the query but only return one element
User.first
admins.first
johns.last

# Execute the query and iterate over the returned elements
User.each{|user| ... }
User.admins.each{|admin_user| ... }
johns.map{|john_user| ... }

因此,在Class中定义一些命名范围,然后使用它们创建条件,并在需要时进行实际查询(延迟加载)。即使您不知道自己需要它,Criterias也会为您处理所有这些事情。

答案 1 :(得分:2)

Criteria类似于Relation

中的ActiveRecord对象

你可以这样使用

users = User.where(:project_id => 2)
users.each do |user|
  puts user.name
end
# or
users.all

如果没有任何用户

,这将返回[]
users.all.each do |user|
  puts user.name
end

答案 2 :(得分:1)

从Mongoid :: Criteria获取数组:使用方法.to_a