You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoid基于嵌入文档关联查询同意指定合约版本的用户列表方法

问题解答

这类查询完全可行,无需将ContractAgreement改为非嵌入模式,查询无结果是因为对Mongoid belongs_to 关联的底层存储逻辑理解有误。

错误原因

Mongoid中belongs_to关联只会在当前文档存储关联对象的ID外键,不会嵌套存储整个关联对象的完整内容。你的ContractAgreement类声明了belongs_to :contract_version,实际在MongoDB中存储的字段名为contract_version_id,类型为BSON::ObjectId,不存在你查询时用的contract_version嵌套字段,所以两种写法都匹配不到数据。

正确写法

写法1:点分隔直接匹配外键(单条件查询推荐)

reload!
u = User.all.select{|u| u.contract_agreements.count > 0}.first
cv = u.contract_agreements.first.contract_version
User.where("contract_agreements.contract_version_id"  => cv._id).count

写法2:配合$elemMatch多条件匹配

如果需要同时匹配ContractAgreement的多个字段(比如同时要求签约时间在指定范围内),可以使用$elemMatch:

User.where(contract_agreements: {
  '$elemMatch' => {
    contract_version_id: cv._id,
    date_of_agreement: { '$gte' => 90.days.ago }
  }
}).count

补充说明

如果你的belongs_to关联自定义了foreign_key参数,将上面的contract_version_id替换为你自定义的外键字段名即可。

内容的提问来源于stack exchange,提问作者Julien Lamarche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:04