2016-08-03 3 views
1

조건부 쿼리를 사용하고 싶습니다. 여기 봄 mongotemplate 조건부 쿼리

자바 코드

DBObject groupByIECode = new BasicDBObject("$group", 
       new BasicDBObject("_id", new BasicDBObject("iecode","$iecode")).append("treatmentArms",new BasicDBObject("$first","$evaluationDTOList"))); 
     System.out.println("groupByIECode: "+groupByIECode.toString()); 

     DBObject unwind = new BasicDBObject("$unwind","$treatmentArms"); 
     System.out.println("unwind: "+unwind.toString()); 


     DBObject finalCalculation = new BasicDBObject("$group",new BasicDBObject("_id",null)) 
            .append(
              "Package", new BasicDBObject(
               "$sum", new BasicDBObject(
                "$cond", new Object[]{ 
                 new BasicDBObject(
                  "$eq", new Object[]{ "$treatmentArms.mechanismOrPkg", "Package"} 
                 ), 
                 1, 
                 0 
                } 
               ) 
              ) 
             ); 

     System.out.println("finalCalculation: "+finalCalculation); 
     final AggregationOutput output = projects.aggregate(match,groupByIECode,unwind,finalCalculation); 

그것은 나중에 내가 $cond 운영자가 지원되지 않는다는 것을 발견 MongoException$DuplicateKey

나에게주는 여기 내 쿼리

db.projects.aggregate([ 
{ 
    "$group": { 
     "_id": "$iecode", 
     "treatmentArms": { "$first": "$evaluationDTOList" } 
    } 
}, 
{ "$unwind": "$treatmentArms" }, 
{ 
    "$group": { 
     "_id": null, 
     "Package": { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ "$treatmentArms.mechanismOrPkg", "Package" ] }, 
        1, 0 
       ] 
      } 
     }, 
     "Constraint-relaxing mechanisms": { 
      "$sum": { 
       "$cond": [ 
        { 
         "$and": [ 
          { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] }, 
          { "$eq": [ "$treatmentArms.mechanismTested1", "Constraint-relaxing mechanisms" ] } 
         ] 
        }, 
        1, 
        0 ] 
      } 
     }, 
     "Delivery mechanisms": { 
      "$sum": { 
       "$cond": [ 
        { 
         "$and": [ 
          { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] }, 
          { "$eq": [ "$treatmentArms.mechanismTested1", "Delivery mechanisms" ] } 
         ] 
        }, 
        1, 
        0 ] 
      } 
     }, 
     "Other": { 
      "$sum": { 
       "$cond": [ 
        { 
         "$and": [ 
          { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] }, 
          { "$eq": [ "$treatmentArms.mechanismTested1", "Other" ] } 
         ] 
        }, 
        1, 
        0 ] 
      } 
     } 
    } 
} 
]) 

입니다 spring mongotemplate. 그렇다면이 조건부 쿼리를 spring mongotemplate으로 구현하려면 어떻게해야합니까?

This 링크는 몇 가지 설명이 있지만 그것은 다음과 같이 보인다 MongoDB를 집계 프레임 워크를위한 Spring 데이터 MongoDB의 지원을 사용하여 들어, documentation에서 정규 예를 완전한 이행

답변

1

을 표시하지 않습니다

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 

Aggregation agg = newAggregation(
    pipelineOP1(), 
    pipelineOP2(), 
    pipelineOPn() 
); 

AggregationResults<OutputType> results = mongoTemplate.aggregate(agg, 
    "INPUT_COLLECTION_NAME", OutputType.class); 
List<OutputType> mappedResult = results.getMappedResults(); 

newAggregation 메서드에 대한 첫 번째 매개 변수로 입력 클래스를 제공하면 MongoTemplate에서 this에서 입력 된 입력 컬렉션의 이름을 파생시킵니다 나귀. 그렇지 않은 경우 입력 클래스 을 지정하지 않으면 입력 컬렉션 의 이름을 명시 적으로 제공해야합니다. 입력 클래스와 입력 컬렉션이 제공되면 후자가 우선합니다. 당신의 쿼리


$cond 연산자 집계 파이프 라인에서 하나의 그룹 작업을 나타내는 DBObject에 적용하려면 AggregationOperation 인터페이스를 구현하는 해결 방법 작성 :

public class GroupAggregationOperation implements AggregationOperation { 
    private DBObject operation; 

    public GroupAggregationOperation (DBObject operation) { 
     this.operation = operation; 
    } 

    @Override 
    public DBObject toDBObject(AggregationOperationContext context) { 
     return context.getMappedObject(operation); 
    } 
} 

그런 다음 $group 작업을 보유한 파이프 라인과 동일한 집계 파이프 라인의 DBObject로 구현하십시오.

DBObject operation = (DBObject) new BasicDBObject("$group", new BasicDBObject("_id", null)) 
    .append(
     "Package", new BasicDBObject(
      "$sum", new BasicDBObject(
       "$cond", new Object[]{ 
        new BasicDBObject(
         "$eq", new Object[]{ "$treatmentArms.mechanismOrPkg", "Package"} 
        ), 
        1, 
        0 
       } 
      ) 
     ) 
    ); 

당신이 다음 사용할 수있는 :

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 

GroupAggregationOperation groupOp = new GroupAggregationOperation(operation); 
Aggregation agg = newAggregation(
    group("iecode").first("treatmentArms").as("treatmentArms"), 
    unwind("treatmentArms"), 
    groupOp 
); 
AggregationResults<Entity> results = mongoTemplate.aggregate(agg, Entity.class); 
List<Entity> entities = results.getMappedResults(); 
+0

내가'Aggregation' 개체에서'DBObject'를 얻을 수 있습니다. 사실 나는 클래스 (엔티티)가 아니 었습니다. –

+0

내 쿼리를 실행하려는 컬렉션 이름은 어디에 지정해야합니까? –

+1

@HalfBloodPrince [documentation] (http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation.basic-home.html)의 표준 예제를 사용하여 내 대답을 업데이트했습니다. 개념) 내가 당신을 통해 격려 것이 좋습니다. – chridam