2016-09-08 9 views
3

자바 봄 데이터에 여러 필드를 밀어 : 나는 자바 봄 - 데이터 - MongoDB의에서이 질의를 필요로한다

db.wizard.aggregate(
{ 
$group: { 
    _id: "$title", 
    versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}} 
    } 
}) 

을 내 현재 솔루션은 다음과 같습니다

Aggregation agg = Aggregation.newAggregation(
      Aggregation.group("title"). 
        push("version").as("versions") 
    ); 

문제는 푸시 메서드 (버전, 작성자, 날짜 추가)에 필드를 추가하는 방법을 모르겠다는 것입니다. Spring-Data-MongoDB로 가능합니까?

+0

"문자열 화 된"mongo-shell 쿼리를 넣으려면'AggregationOperation' 클래스를 확장하고'toDBObject' 또는 이와 유사한 메소드 (드라이브 버전에 따라)를 오버라이드하십시오. 네이티브 스프링 데이터와 호환되지 않는 집계 단계의 해결 방법을 많이 사용했습니다. – Valijon

+0

필요하다면 예제를 추가 할 수 있습니다. – Valijon

+0

예를 게시하면 멋질 것입니다. – quiros

답변

1

참고 : MongoDB를 버전 2.6-3.0 (호환 자바 드라이버)

내가 구현하는 org.springframework.data.mongodb.core.aggregation.AggregationOperation 클래스를 확장 한 사용자 정의 toDBObject은 방법 :

귀하의 경우
public class GenericAggregationOperation implements AggregationOperation { 

    private String operator; 
    private DBObject query; 

    /** 
    * Default constructor. 
    * 
    * @param operator MongoDB operator ($group, $sort, $project, etc..) 
    * @param query MongoDB aggregation query step string 
    */ 
    public GenericAggregationOperation(String operator, String query) { 
     this(operator, (DBObject) JSON.parse(query)); 
    } 

    /** 
    * Default constructor. 
    * 
    * @param operator MongoDB operator ($group, $sort, $project, etc..) 
    * @param query MongoDB aggregation query step DBObject 
    */ 
    public GenericAggregationOperation(String operator, DBObject query) { 
     this.operator = operator; 
     this.query = query; 
    } 

    @Override 
    public DBObject toDBObject(AggregationOperationContext context) { 

     return new BasicDBObject(operator, query); 
    } 

} 

, 그것은 다음과 같습니다

List<AggregationOperation> list = new ArrayList<AggregationOperation>(); 
lista.add(new GenericAggregationOperation("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }")); 

TypedAggregation<EpisodeIndexDto> agg = Aggregation.newAggregation(
    YourClassTitleVersion.class, list); 
mongoOperations.aggregate(agg, YourClassTitleVersion.class, 
    YourClassTitleVersion.class).getMappedResults(); 

희망이 도움이 될 것입니다.

+1

감사합니다. 매력처럼 작동합니다. – quiros

+0

완벽. 천만에요 – Valijon

7

Aggregation 파이프 라인 단계 중 하나에 BasicDbObject를 직접 전달할 수 있습니다.

Aggregation agg = newAggregation(
      group("title"). 
      push(new BasicDBObject 
        ("version", "$version").append 
        ("author", "$author").append 
        ("dateAdded", "$dateAdded")).as("versions"));