我试图做一些简单的如:Mongoid“标准”是如何工作的?
User.all(:criteria => {:project_id => 2})
这返回的Mongoid::Criteria
我可以用这个标准去做的实例?如果我只是想返回一系列文件作进一步评估呢?
我试图做一些简单的如:Mongoid“标准”是如何工作的?
User.all(:criteria => {:project_id => 2})
这返回的Mongoid::Criteria
我可以用这个标准去做的实例?如果我只是想返回一系列文件作进一步评估呢?
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
如果没有符合该标准的用户,那么当我运行puts user.name时,我会自己回到“Criteria”。无论如何要避免这种情况? – randombits
如果现在有任何用户'puts user.name'将不会执行 – fl00r
'users.all'不返回数组。它返回另一个标准,通常不需要。要从条件中获取数组,请使用.to_a – tothemario
在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)
最后,得到的磁盘阵列和元素:
# 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| ... }
所以,定义一些命名然后使用它们创建一个标准,并在需要时进行真正的查询(延迟加载)。即使你不知道你需要这些,Critterias也会为你处理这些事情。
要从Mongoid ::标准得到一个数组:使用.to_a
所以'all'在ActiveRecord的返回数组的方法。你想调用'execute'来获取数组。 'User.where(project_id:2).execute' – Travis