2017-12-20 5 views
2

MongoDB를 처음 사용했습니다. 다음 쿼리는 매우 오랜 시간이 걸립니다. MongoDB를 여러 번 치는 대신 레코드 목록을 얻도록 어떻게 조정해야합니까?내 mongotemplate 쿼리를 조정하는 데 도움이 필요합니다. 6-7 초

List newList = new ArrayList(); 
listDetails.forEach(query -> { 
    BasicDBObject criteria1 = new BasicDBObject(); 
    criteria1.put("_id", query.getId()); 
    BasicDBObject criteria2 = new BasicDBObject(); 
    criteria2 .put("$elemMatch", new BasicDBObject("ID", query.getEmpId())); 
    BasicQuery basicQuery = new BasicQuery(criteria1, new BasicDBObject("empName", criteria2)); 
    newList.add(mongoTemplate.findOne(basicQuery, ClassName.class)); 
}); 
+0

[스프링 몽고 db 쿼리에 여러 기준 지정] (https://stackoverflow.com/questions/45719225/specify-multiple-criterias-in-spring-mongo-db-query) – Veeram

+0

안녕하세요 @Veamam i https://stackoverflow.com/questions/457192의 답변과 혼동스러워합니다. 25/specify-multiple-criterias-in-spring-mongo-db-query 내 요구 사항에 대한 논리를 수정하고 알려 주실 수 있습니까? 미리 감사드립니다 !! – Vbr

답변

0

검색어에 투영 기준도 포함되어 있는지 알지 못했습니다. 이렇게하면 쿼리 조건을 OR'ing하지 않고 all을 서버로 보냅니다.

먼저 모든 쿼리 조건을 OR로 보내고 결과를 얻은 다음 투영 된 배열 필드에서 조건을 일치시키는 클라이언트 측 필터링을 수행 할 수 있습니다.

서버 파트

Query orQuery = new Query(); 
Criteria orCriteria = new Criteria(); 
List<Criteria> orExpression = new ArrayList<>(); 
listDetails.forEach(query -> { 
    Criteria expression = Criteria.where("_id").is("1").and("empName.ID").is(query.getEmpId()); 
    orExpression.add(expression); 
}); 
orQuery.fields().include("empName"); 
orQuery.addCriteria(orCriteria.orOperator(orExpression.toArray(new Criteria[orExpression.size()]))); 
List<ClassName> results = mongoTemplate.find(orQuery, ClassName.class); 

클라이언트 파트 (단일 서버 호출을 보낼 기준을 OR로)

(empName 필드에 EMP 식별자에 대해 listdetails에서 EMP ID를 일치시켜 empName 목록을 필터링)
Map<String, String> ids = listDetails.stream().collect(toMap(Class1::getId, Class1::getEmpId)); 
results.forEach(cm -> cm.setEmpName(cm.getEmpName().stream().filter(sc -> sc.getID().equals(ids.get(cm.getId()))).collect(toList())));