Mongoid:如何通过参考负载只有一个对象,你延迟加载的一些领域?(Mongoid: How to

2019-06-24 05:54发布

出于性能方面的原因,我经常用尽可能的only()以指定我要加载的领域书写了mongoid查询时关键字。

普通嫌疑犯,是例如当我想我所有的管理员只为显示目的的用户的电子邮件。

我会写:

User.where(:groups => :admins).only(:email).each do |u|
 puts u.email
end

我这样做是因为我的用户模型是相当充分了很多,清单一堆邮件时,我可以很高兴地忽视数据。

然而,现在我们想象,我的用户是通过一个项目模型中引用,使每个项目我可以这样做: project.user 。 由于mongoid的延迟加载,我的目标用户将只能被实例化(从DB查询),当我呼吁参考。

但是,如果我想要的东西列出,例如所有管理项目的所有者的所有电子邮件?

我会这样写:

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 ,但我不能。 有任何想法吗 ?

亚历克斯

Answer 1:

从Mongoid的创造者回答。 这是不可能的呢。 它被添加的功能要求。



Answer 2:

我认为你需要在这里反正规化。 首先,阅读对非规范化的注记 。

您可以使用mongoid事件实现自我的非正规化或者使用大mongoid_denormalize宝石。 它非常直接和实施之后,你可以使用p.user_email在查询什么的。



文章来源: Mongoid: How to load only some fields of an object you lazy load via reference?