Mongoid"标准"如何运作?

ran*_*its 7 ruby-on-rails mongodb mongoid

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

User.all(:criteria => {:project_id => 2})
Run Code Online (Sandbox Code Playgroud)

这将返回一个实例 Mongoid::Criteria

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

tot*_*rio 16

在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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,您没有向mongo数据库发出任何查询,您只是在编写查询.

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

young_admins = admins.merge(young)
old_admins = admins.where(age.gt => 60)
Run Code Online (Sandbox Code Playgroud)

最后,获取带有元素的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| ... }
Run Code Online (Sandbox Code Playgroud)

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


fl0*_*00r 3

Criteria是类似Relation对象的东西ActiveRecord

你可以这样使用它

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

[]如果没有任何用户,这将返回

users.all.each do |user|
  puts user.name
end
Run Code Online (Sandbox Code Playgroud)