出于性能原因,我尽可能经常使用only()
编写 mongoid 查询时使用关键字来指定我想要加载的字段。
通常的嫌疑是,例如,当我希望所有管理员的用户电子邮件仅用于显示目的时。
我会写:
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
我这样做是因为我的用户模型充满了大量数据,在列出一堆电子邮件时我可以很乐意忽略这些数据。
但是,现在想象一下,我的用户是通过项目模型引用的,因此对于每个项目我可以执行以下操作:project.user
。由于 mongoid 的延迟加载,当我调用引用时,我的对象用户只会被实例化(并从数据库查询)。
但是,如果我想列出所有管理项目所有者的所有电子邮件,该怎么办?
我会这样写:
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
这里的主要问题是,这样做时,我会加载每个项目的整个用户对象,如果有很多项目与查询匹配,那么可能会变得非常繁重。那么如何只加载电子邮件呢?
我可以这样做:
User.where(:_id => p.user_id).only(:email).first.email
但这显然违背了简单地执行以下操作的良好语法的目的:
p.user.email
我希望我能写一些类似的东西:p.user.only(:email).email
,但我不能。有任何想法吗 ?
Alex