【问题标题】:Mongoid query with where clause on an association of an embeded document嵌入文档关联的带有 where 子句的 Mongoid 查询
【发布时间】:2021-11-24 16:39:52
【问题描述】:

我有一个使用 Mongoid 的 Rails 应用程序,其类为 UserContractAgreementContractVersions

关系如下:User嵌入ContractAgreement,而ContractAgreement属于ContractVersions,像这样:

用户

class User
  include Mongoid::Document
  include Mongoid::Stateful
  include Mongoid::Timestamps

  [...]
  embeds_many :contract_agreements

合同协议

class ContractAgreement
  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :user
  belongs_to :contract_version
  field :date_of_agreement, type: DateTime

合同版本

class ContractVersion
  include Mongoid::Document
  include Mongoid::Timestamps

  field :version, type: String
  field :description, type: String
  field :status, type: String
  has_one :post, autosave: true

  has_one :post, autosave: true
  #has_many :contract_agreements

如您所见,#has_many :contract_agreements 被注释掉,因为 Mongoid 不喜欢与嵌入文档的关联。

有没有办法获取同意指定合同的用户列表?

我一直都尝试过$elemMatch

[64] pry(main)> reload!; 
     u = User.all.select{|u| u.contract_agreements.count > 0}.first ; 
     cv = u.contract_agreements.first.contract_version ; 
     User.where(contract_agreements: {'$elemMatch' => {contract_version: {'$elemMatch' => {_id: cv._id}}}}).count
Reloading...
=> 0

以及压缩的单个查询表示法:

[64] pry(main)> 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
Reloading...
=> 0

我知道我要求的合同版本 ID 存在,因为我明确选择了一个用户。

这样的查询是否可能,或者我是否需要取消嵌入 ContractAgreement?如果可能,我做错了什么?

【问题讨论】:

    标签: mongoid


    【解决方案1】:

    引用外键工作:

    [73] pry(main)> 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
    Reloading...
    => 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2011-04-26
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多