[SPRING] Spring-MongoDb 집계 프레임 워크에서 $ cond 연산을 사용하는 방법
SPRINGSpring-MongoDb 집계 프레임 워크에서 $ cond 연산을 사용하는 방법
나는 다음과 같은 프로젝트를 포함하는 집계 파이프 라인을 가지고있다 :
$project: {
start: {
$cond: {
if: {
$eq: ["$start", "EARLY"]
},
then: "$deltastart.start",
else: "$deltastart.end"
}
},...
},...
mongo 쉘에서 잘 작동합니다. Spring-Mongodb에서 Aggregation 프레임 워크를 사용하여이를 표현하는 방법은 무엇입니까? 나는 ProjectionOperationBuilder, ExpressionProjectionOperationBuilder 타입을 보았지만 예제를 사용하지는 않았다 ... 어떤 제안을 했는가?
해결법
-
==============================
1.$ project 파이프 라인을 통해 $ cond 연산자를 지원하는 현재 Spring Data 릴리스를 사용하는 경우 (untested) 다음과 같이 변환 할 수 있습니다.
$ project 파이프 라인을 통해 $ cond 연산자를 지원하는 현재 Spring Data 릴리스를 사용하는 경우 (untested) 다음과 같이 변환 할 수 있습니다.
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.*; import org.springframework.data.mongodb.core.query.Criteria; Cond condOperation = ConditionalOperators.when(Criteria.where("start").is("EARLY")) .thenValueOf("deltastart.start") .otherwise("deltastart.end"); Aggregation agg = newAggregation(project().and(condOperation).as("start")); AggregationResults<MyClass> results = mongoTemplate.aggregate(agg, MyClass.class); List<MyClass> myList = results.getMappedResults();
집계 연산에서 $ cond 연산자를 지원하지 않는 Spring-Data MongoDB 버전의 경우, AggregationOperation 인터페이스를 구현하여 DBObject를 취할 수있는 해결 방법이 있습니다.
public class CustomProjectAggregationOperation implements AggregationOperation { private DBObject operation; public CustomProjectAggregationOperation (DBObject operation) { this.operation = operation; } @Override public DBObject toDBObject(AggregationOperationContext context) { return context.getMappedObject(operation); } }
그런 다음 $ 프로젝트 작업을 집계 파이프 라인에있는 것과 동일한 DBObject로 구현하십시오.
DBObject operation = (DBObject) new BasicDBObject( "$project", new BasicDBObject( "start", new BasicDBObject( "$cond", new Object[]{ new BasicDBObject( "$eq", new Object[]{ "$start", "EARLY"} ), "$deltastart.start", "$deltastart.end" } ) ) );
그런 다음 유형 집계에서 사용할 수 있습니다.
TypedAggregation<CustomClass> aggregation = newAggregation(CustomClass.class, new CustomProjectAggregationOperation(operation) ); AggregationResults<CustomClass> result = mongoTemplate.aggregate(aggregation, CustomClass.class);
-
==============================
2.나는 동일한 문제를 추가하고 Google에서 검색 한 결과 이것이 내가 발견 한 첫 번째 결과이므로 ConditionalOperators.Cond 클래스를 사용하여 버전 1.10 RC1부터이 기능을 사용할 수 있다는 미래의 독자를 추가하고 싶습니다.
나는 동일한 문제를 추가하고 Google에서 검색 한 결과 이것이 내가 발견 한 첫 번째 결과이므로 ConditionalOperators.Cond 클래스를 사용하여 버전 1.10 RC1부터이 기능을 사용할 수 있다는 미래의 독자를 추가하고 싶습니다.
여기에서 JavaDoc을 읽을 수 있습니다.
from https://stackoverflow.com/questions/29186185/how-to-use-cond-operation-in-spring-mongodb-aggregation-framework by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 최대 절전 모드 : MyInterceptor # onFlushDirty는 호출되지 않습니다. (0) | 2018.12.13 |
---|---|
[SPRING] Eclipse와 같은 진행 표시 줄로 스플래시 화면 만들기 (0) | 2018.12.13 |
[SPRING] Mongodb 중첩 된 배열 내부의 값 증가 (0) | 2018.12.13 |
[SPRING] Java SE + Spring 데이터 + 최대 절전 모드 (0) | 2018.12.12 |
[SPRING] Spring MVC로 JSP에 js와 CSS를 포함시키는 법 (0) | 2018.12.12 |