Spring Data MongoDB 存储库查询嵌套对象中的多个字段

SpringData MongoDB Repositories Query on multiple fields in nested object

我在使用两个参数查询嵌套对象时遇到问题。

这是我的文档:

@Document(collection = "contracts")
public class Contract {
    @Id
    String _id;
    List<Stakeholder> stakeholders;
    Long contractRef;
}

这是我的嵌套对象:

public class Stakeholder{
    String nationalId;
    String stakeholderRole;
}

我正在使用 mongoRepository 查询此集合:

public interface ContractRepository extends PagingAndSortingRepository<Contract, String> {
@Query( value = "{'countryBranchCode' : ?0, 'contractRef' : ?1, 'stakeholders' : {'nationalId' : ?2, 'stakeholderRole' : ?3} }",
        fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndNationalIdAndStakeholderRole
        (String countryBranchCode, Long contractRef, String nationalId, String stakeholderRole);

基本上,我想找到一个具有 contractRef 的合同和一个具有 nationalId 和 stakeholderRole 匹配的利益相关者。

我尝试了一个更简单的查询:

@Query( value = "{'countryBranchCode' : ?0, 'contractRef' : ?1, 'stakeholders.nationalId' : ?2, 'stakeholders.stakeholderRole' : ?3  }",
        fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndNationalIdAndStakeholderRole
        (String countryBranchCode, Long contractRef, String nationalId, String stakeholderRole);

但这可以 return 一个合同有一个利益相关者具有匹配的 nationalId 和错误的角色,而另一个利益相关者具有错误的 nationalId 和好的角色,所以这不是我想要的。

您可以尝试使用 $elemMatch

@Query( value = "{'countryBranchCode' : ?0,'contractRef':?1,'stakeholders':{'$elemMatch':{'nationalId':?2,'stakeholderRole':?3}}}",
fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndStakeholderRoleAndNationalId (String countryBranchCode, Long contractRef,String stakeholderRole, String nationalId);