我有以下查询/投影用于从我的数据集中检索数据:
db.library.find({
party_id: 'TEST_PARTY_ID',
contract_id : 'TEST_CONTRACT_ID'
},
{
library_list: {
$elemMatch: {
book_code: 'TST_BOOK_CODE'
}
}
})
换句话说:通过party_id和contract_id查找所有文档,并返回library_list数组中的library_list元素,其中书籍代码匹配' TST_BOOK_CODE'。
我想将此查询添加到我的Spring Repository,因此我创建了以下内容:
@Query(value="{party_id: ?0, contract_id : ?1}", fields="{'library_list': {$elemMatch: {'book_code': ?2}}}")
Library findLibraryByPartyAndContractAndBookCode(String partyId, String contractId, String bookCode);
这不起作用。我收到一份文件,其中除文件ID外,一切都为空。如果我删除"字段"但是,我得到了整个文档。它看起来像"值"选择器很好,但是"字段"存在问题。选择。 JPA不支持$ elemMatch语法吗?根据javadoc:"Both attributes allow using a placeholder notation of ?0, ?1 and so on",所以我认为不应该是问题。
答案 0 :(得分:0)
我无法为直接解决方案设计修复但是,由于这个问题没有收到任何回复,我想我会为此发布我的解决方法。
我必须创建一个单独的存储库类,并使用以下Query来构造选择和投影:
Query q = new Query().addCriteria(Criteria.where("party_id")
.is(partyId)
.and("contract_id").is(cardId));
q.fields()
.elemMatch("library_list", Criteria.where("book_code").is(preferenceCode));
List<LibraryList> ret = mongoTemplate.find(q, LibraryList.class);