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
相关产品推荐
相关产品推荐

