복붙노트

[SPRING] Spring-MongoDb 집계 프레임 워크에서 $ cond 연산을 사용하는 방법

SPRING

Spring-MongoDb 집계 프레임 워크에서 $ cond 연산을 사용하는 방법

나는 다음과 같은 프로젝트를 포함하는 집계 파이프 라인을 가지고있다 :

$project: {
  start: {
    $cond: {
      if: {
        $eq: ["$start", "EARLY"]
      },
      then: "$deltastart.start",
      else: "$deltastart.end"
    }
  },...
},...

mongo 쉘에서 잘 작동합니다. Spring-Mongodb에서 Aggregation 프레임 워크를 사용하여이를 표현하는 방법은 무엇입니까? 나는 ProjectionOperationBuilder, ExpressionProjectionOperationBuilder 타입을 보았지만 예제를 사용하지는 않았다 ... 어떤 제안을 했는가?

해결법

  1. ==============================

    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. ==============================

    2.나는 동일한 문제를 추가하고 Google에서 검색 한 결과 이것이 내가 발견 한 첫 번째 결과이므로 ConditionalOperators.Cond 클래스를 사용하여 버전 1.10 RC1부터이 기능을 사용할 수 있다는 미래의 독자를 추가하고 싶습니다.

    나는 동일한 문제를 추가하고 Google에서 검색 한 결과 이것이 내가 발견 한 첫 번째 결과이므로 ConditionalOperators.Cond 클래스를 사용하여 버전 1.10 RC1부터이 기능을 사용할 수 있다는 미래의 독자를 추가하고 싶습니다.

    여기에서 JavaDoc을 읽을 수 있습니다.

  3. from https://stackoverflow.com/questions/29186185/how-to-use-cond-operation-in-spring-mongodb-aggregation-framework by cc-by-sa and MIT license