我正在尝试直接做一些事情,例如:
User.all(:criteria => {:project_id => 2})
这将返回Mongoid::Criteria
我可以用这个标准做什么?如果我只想返回文档数组以进行进一步评估,该怎么办?
答案 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