2017-05-10 30 views
0

저는 스프링 데이터 mongodb를 사용하는 프로젝트에서 일하고 있습니다. 다음과 같은 문구 쿼리를 만들고 있습니다.기준에 mongodb 집계 함수를 사용하는 방법?

Query query = new Query(); 

Criteria one = Criteria.where(DB_FIELD_1).gt(1); 
Criteria two = Criteria.where(DB_FIELD_2).lt(10); 

Criteria final = new Criteria().andOperator(one,two); 
query.addCriteria(final); 

// after making the query, I am executing it using mongoTemplate 

이제 YYYYMMDD 형식의 날짜 필드가 있습니다. 그 달 = 당월인지 확인하고 싶습니다. 예를 들어 필드가 20170501이면 날짜 월 (05)은 현재 월 (5 월, 5 월)입니다. 어떻게 날짜에서 월 값을 추출하고 위의 다른 기준 (1과 2)과 함께이 논리를 확인합니까? 날짜에서 월 값을 추출하는 데 $ 월이 있다는 것을 알고 있습니다. 그러나 "Criteria"클래스 내에 집계 함수를 통합하는 방법을 모르겠습니다. 최종 결과는 다음과 같아야합니다.

Criteria final = new Criteria().andOperator(one,two,criteria to check month = current month); 
query.addCriteria(final); 
+0

날짜 필드에 대한 사용이 DB에 문자열로 저장됩니다? – pvpkiran

+0

날짜로 저장 됨 – user3528213

+0

컬렉션의 샘플 문서를 게시물에 추가 할 수 있습니까? 스프링 몽고 db 버전은 무엇입니까? 이 경우 투영 표현식을 사용해야합니다. – Veeram

답변

1

현재 스프링 db 버전 1.10.2/Spring 1.5.2 Boot에서 아래의 집계 파이프 라인을 사용할 수 있습니다. 출력하려는 ​​다른 필드를 $project에 포함 시키십시오.

3.4x mongo 서버 버전의 경우 $project 대신 $addFields을 사용하십시오.

AggregationOperation project = Aggregation.project().and(DateOperators.dateOf(DB_FIELD_1).month()).as("field1").and(DateOperators.dateOf(DB_FIELD_2).month()).as("field2"); 
AggregationOperation match = Aggregation.match(Criteria.where("field1").gt(1) 
       .and("field2").lt(10)); 
Aggregation aggregation = Aggregation.newAggregation(project, match); 
List<BasicDBObject> results = mongoTemplate.aggregate(aggregation, collectionname, BasicDBObject.class).getMappedResults(); 

1.4.1 버전

AggregationOperation project = Aggregation.project().and(DB_FIELD_1).extractMonth().as("field1").and(DB_FIELD_2).extractMonth().as("field2"); 
+0

첫 번째 줄에는 project()가 무엇입니까? – user3528213

+0

죄송합니다.'$ project' 스테이지를 만드는 것입니다. 'Aggregation.project()'를 사용하십시오. 업데이트 된 답변. – Veeram

+0

그리고 DateOperators도 있습니다. 그 클래스를 찾을 수 없습니다. – user3528213