Mongoid:如何仅加载通过引用延迟加载的对象的某些字段?

2023-11-23

出于性能原因,我尽可能经常使用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


来自 Mongoid 创建者的回答。目前还不可能。它已作为功能请求添加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongoid:如何仅加载通过引用延迟加载的对象的某些字段? 的相关文章

随机推荐

  • 计算总和为零的所有连续子数组

    给定长度为 n 的随机数 正数和负数 数组 我想要数字连续的子数组 其总和等于零 Example 鉴于我有数组a 1 1 2 2 6 6 输出将是6因为子数组如下 1 1 2 2 6 6 1 1 2 2 2 2 6 6 1 1 2 2 6
  • 使用 JPA 注释映射 java.util.Map 时键和值列名称会覆盖

    我正在研究使用 Hibernate 4 1 9 和 JPA 注释来注释地图的不同方法 如果我想存储一个 Map 其中键是实体值的属性 则标记如下所示 OneToMany mappedBy deptById targetEntity com
  • C# 属性集合[重复]

    这个问题在这里已经有答案了 我有一个特定的内置属性集合 例如 System Runtime Serialization SerializedAttribute 我想将其应用于特定的类集合 是否有可能将这些属性合而为一 我不想将它们全部显式应
  • 在一张图上绘制两张图。功能线不起作用

    我想在一张图上绘制两张图 我读这个帖子 但函数lines不起作用 什么也没有发生 我不知道会出现什么问题 有任何想法吗 编辑 可重现的例子 gt tr error 1 0 2314984 0 2314990 0 2314981 0 2314
  • MIME 类型('text/html')不是受支持的样式表

    我正在将 css 文件链接到我的express handlebars 文件 但收到此错误 拒绝应用来自 的样式http localhost 4000 cs366 style draft css 因为它的 MIME 类型 text html
  • 退出当前浏览器(返回一级)

    有时你会抛出多个browser进入一个函数进行调试 我知道你可以退出整个shebangQ但是如果您想退出第二个浏览器 参见下面的代码 并返回到第一级浏览器怎么办 我听说过类型c但这并没有退出第二层browser FUN lt functio
  • 将变量从一个 HTML 页面传递到另一个 HTML 页面的最佳实践是什么?

    我对网络应用程序编程比较陌生 所以我希望这个问题对每个人来说都不是太基础 我创建了一个 HTML 页面 其中包含一个包含 dojox 数据网格 v1 2 的 FORM 其中填充了不同杂货项目的描述行 用户选择他感兴趣的项目后 他将单击 提交
  • UIImagePickerController 的cameraViewTransform 忽略了 iOS 10 beta 上的“缩放”和“平移”

    我一直在使用下面的代码来缩放 UIImagePickerController 的实时预览以填充整个屏幕 到目前为止 这一切都很完美 几天前 我在 iPhone 5 上安装了 iOS 10 beta 7 但它不再扩展了 我可以在 UIImag
  • PCL .NET 4.5 定时器

    我正在使用 Xamarin 和 MvvmCross 构建跨平台应用程序 我需要每分钟调用服务器更新一次 稍后我将转向推送通知 但我无法在我的核心项目中设置计时器 我见过 MvvmCross N 42 但我相信目标项目比较旧 允许计时器 下面
  • Translation.E004) 您为 LANGUAGE_CODE 设置提供了一个不在 LANGUAGES 设置中的值

    我刚刚重新映像了我的计算机 因此为我的 django 项目设置了所有内容 然后在运行服务器时出现此错误 我不知道它指的是什么 因为我的原始网站是开箱即用的 而且我会说英语 并且该网站是一个内部工作网站 因此没有理由做任何基于语言的事情 有谁
  • Angular 2 中的错误处理程序和拦截器有什么区别?

    另外 对于实时 Web 应用程序 ng2 中前端错误处理的最佳解决方案是什么 使用 Http拦截器 进行前端错误处理可以吗 请解释一下这些事情 Angular 2 中的错误处理程序和拦截器有什么区别 根据 Angular 文档 它们是这样定
  • 在 Ubuntu 上更新 TimescaleDB 后 Postgres 出现错误:找不到文件

    如指定官方文档我将 Timescale PPA 存储库添加到apt 然后我通过安装它sudo apt install timescaledb postgresql 9 6 一切都工作正常 随着最近的运行sudo apt upgrade时间刻
  • 更改当前正在运行的进程的所有者

    我有一个当前正在运行的进程pid PID 并由user foo这是not root 我想将此进程的所有权转移给另一个进程user bar这也是not root 是否有一个 shell 命令可以更改进程的所有者 我正在考虑一个chown但对于
  • Stripe:为订阅添加免费天数

    是否可以为 Stripe 上的有效订阅添加免费天数 我想这样做是为了创建一个推荐计划 当用户推荐某人时 他将获得 10 天的免费时间 我认为一个好方法是更新current period endvar 但我在文档中找不到如何执行此操作 例如
  • Array.Sum() 导致溢出

    我有一个像这样的 int 数组 int arr 256741038 623958417 467905213 714532089 938071625 然后我创建了一个 int64 var Int64 sum arr Sum 但这导致了溢出 运
  • Delphi XE - RawByteString 与 AnsiString

    我在这里有一个类似的问题 Delphi XE 我应该使用 String 还是 AnsiString 在决定在我的 大型 库中使用 ANSI 字符串是正确的之后 我意识到我实际上可以使用 RawByteString 而不是 ANSI 因为我将
  • 创建可下载的自定义主题并在运行时应用它

    我正在制作一个 Android 应用程序 需要允许客户端维护来自服务器的资源 其中包括字符串 可绘制对象等 我已经创建了一种机制来下载包含所有这些文件的 zip 文件 并且它们能够非常轻松地更改字符串 我还创建了一种允许客户端更改 UI 控
  • Java抽象类和接口[重复]

    这个问题在这里已经有答案了 在面试中我被问到以下问题 我试图回答这个问题 但我想要问题的确切答案 如果我可以将抽象类模拟为接口 为什么java还要提供接口呢 这意味着如果在抽象类中我可以将所有方法标记为抽象 然后抽象类将充当接口 那么为什么
  • 将包含字典列表的列转换为 pandas 数据框中的多列

    我有一个 Pandas 数据框 如下所示 pd DataFrame a 1 2 b c 1 d 5 c 3 d 7 c 10 d 50 Out 2 a b 0 1 u c 1 u d 5 u c 3 u d 7 1 2 u c 10 u d
  • Mongoid:如何仅加载通过引用延迟加载的对象的某些字段?

    出于性能原因 我尽可能经常使用only 编写 mongoid 查询时使用关键字来指定我想要加载的字段 通常的嫌疑是 例如 当我希望所有管理员的用户电子邮件仅用于显示目的时 我会写 User where groups gt admins on