springboot~mogodb多(duo)條(tiao)件拼接
起因
當(dang)前我們使(shi)用mongodb進行查詢時,有時我們的(de)(de)條(tiao)(tiao)件(jian)是(shi)(shi)分塊(kuai)生(sheng)成(cheng)的(de)(de),它可能(neng)來自一(yi)個(ge)列表里,我們的(de)(de)條(tiao)(tiao)件(jian)需(xu)(xu)要(yao)(yao)根據(ju)列表去返(fan)回數(shu)據(ju),這(zhe)(zhe)里有個(ge)問題,如果遍歷列表,然后每次都去從mongodb里查詢數(shu)據(ju) ,這(zhe)(zhe)種(zhong)性能(neng)顯然是(shi)(shi)不好的(de)(de),我們需(xu)(xu)要(yao)(yao)把(ba)條(tiao)(tiao)件(jian)進行拼(pin)接,一(yi)次把(ba)數(shu)據(ju)查詢出來!
分析
使用Criteria這個對(dui)象去構建查詢條件,使用orOperator來組合多(duo)個Criteria實例,最終將列(lie)表里所有(you)條件拼接出來,從返回(hui)查詢一(yi)次即可返回(hui)全部數據 。
Criteria[] criterias = criteriaList.toArray(new Criteria[criteriaList.size()]);
Criteria criteria = new Criteria();
criteria.orOperator(criterias);
Query query = Query.query(criteria);
實現
private List<x> getClients(List<CodeAccountPeriod> codeAccountPeriods) {
List<Criteria> criteriaList = new ArrayList<>();
for (CodeAccountPeriod codeAccountPeriod : codeAccountPeriods) {
criteriaList.add(where("accountPeriod").is(codeAccountPeriod.getAccountPeriod())
.and("code").is(codeAccountPeriod.getCode())
);
}
Criteria[] criterias = criteriaList.toArray(new Criteria[criteriaList.size()]);
Criteria criteria = new Criteria();
criteria.orOperator(criterias);
Query query = Query.query(criteria);
List<String> fields = new ArrayList<String>(
Arrays.asList("accountPeriod", "code", "client", "taxProperty", "version"));
for (String name : fields) {
query.fields().include(name);
}
List<x> clients = mongoTemplate.find(query, x);
return clients;
有(you)時解決問(wen)題的方法可以(yi)有(you)多種,我們需要從(cong)另一個方面去考(kao)慮它。