2014-06-12 5 views
0

을 검색하기 위해 Spring Data Mongodb에서 $$ ROOT를 사용하여 전체 문서를 검색하는 집계 쿼리를 수행 할 수 있습니다. 이렇게하려면 $$ ROOT 변수를 사용합니다.mongodb 쉘을 사용하여 전체 문서

db.reservations.aggregate([ 
    { $match : { hotelCode : "0360" } }, 
    { $sort : { confirmationNumber : -1 , timestamp: -1 } }, 
    { $group : { 
     _id : "$confirmationNumber", 
     timestamp :{$first : "$timestamp"}, 
     fullDocument :{$first : "$$ROOT"} 
    }} 
]) 

내용이 confirmationNumber, timestamp, fullDocument 인 객체를 검색합니다. fullDocument는 전체 문서입니다.

스프링 - 데이터 및 집계 프레임 워크에서 동일한 작업을 수행 할 수 있는지 궁금합니다.

내 자바 코드는 다음과 같습니다

TypedAggregation<ReservationImage> aggregation = newAggregation(
    ReservationImage.class, 
    match(where("hotelCode").is(hotelCode)), 
    sort(Direction.DESC,"confirmationNumber","timestamp"), 
    group("confirmationNumber"). 
    first("timestamp").as("timestamp"). 
    first("$$ROOT").as("reservationImage")); 
    List<myClass> items = mongoTemplate.aggregate(
    aggregation, 
    myClass.class).getMappedResults(); 

오류가 없습니다 : org.springframework.data.mapping.PropertyReferenceException : No 재산권 $$ myClass 타입

당신이 어떤 생각을 가지고 있습니까 찾을?

감사합니다.

+0

는 왜 달라야? 차이점을 찾는 실제 Java 코드는 무엇입니까? –

+0

답변 해 주셔서 감사합니다. 내 질문에 내 자바 코드를 추가합니다 – Chessman

답변

3

나는 전에 이런 종류의 것을 보았으며 단지 $$ROOT과 같은 변수 이름에만 국한되지 않습니다. Spring 데이터는 파이프 라인에서 문서의 "속성"을 매핑하는 방법에 대한 자체 아이디어를 가지고 있습니다. 또 다른 공통적 인 문제는 인식되지 않는 새 "속성"이름을 가진 새 필드 나 계산 된 필드를 단순히 투사하는 것입니다.

아마도 가장 좋은 방법은 도우미 클래스와 메서드를 사용하지 말고 BSON 문서로 파이프 라인을 구성하는 것입니다. 기본 콜렉션 객체와 원시 출력을 BSON 문서로 가져올 수 있지만 마지막에는 입력 된 List로 캐스트합니다.

마일리지는 기본적으로 실제 접근 방식에 따라 다를 수 있지만 :

중요한 것은이 방법으로 점점이 부과 된 제한이 없어야로 파이프 라인을 건설하는 도우미에서 멀리 이동
DBObject match = new BasicDBObject(
     "$match", new BasicDBObject(
      "hotelCode", "0360" 
     ) 
    ); 

    DBObject sort = new BasicDBObject(
     "$sort", new BasicDBObject(
     "cofirmationNumber", -1 
     ).append("timestamp", -1) 
    ); 

    DBObject group = new BasicDBObject(
     "$group", new BasicDBObject(
      "_id", "confirmationNumber" 
     ).append(
      "timestamp", new BasicDBObject(
       "$first", "$timestamp" 
      ) 
     ).append(
      "reservationImage", new BasicDBObject(
       "$first", "$$ROOT" 
      ) 
     ) 
    ); 

    List<DBObject> pipeline = Arrays.asList(match,sort,group); 

    DBCollection collection = mongoOperation.getCollection("collection"); 
    DBObject rawoutput = (DBObject)collection.aggregate(pipeline); 

    List<myClass> items = new AggregationResults(List<myClass>, rawoutput).getMappedResults(); 

.

+0

당신의 의견을 주셔서 감사합니다. "또 다른 공통적 인 문제는 인식되지 않는 새"속성 "이름을 가진 새 필드 나 계산 된 필드를 단순히 투사하는 것입니다." 스프링 데이터 MongoDB로 할 수있는 일에 대한 예가 있습니까? –

+0

@ThomasDarimont 몇 가지를 발견했습니다. 내 잠잘 시간이야. JIRA 문제를 제출할 장소가 있거나 버그 추적이 있다면 알려줘. 나는 필요한 경우 트렁크에 대해 케이스와 테스트를 파헤 칠 것이다. –

+0

여기에서 JIRA for Spring 데이터 MongoDB를 찾을 수 있습니다 : https://jira.spring.io/browse/DATAMONGO –

4

MongoDB 파이프 라인 표현식에서 시스템 변수에 액세스하는 지원을 추적하기 위해 https://jira.spring.io/browse/DATAMONGO-954을 생성했습니다.

그 자리에 있으면, 당신은 쓸 수 있어야 :

Aggregation agg = newAggregation(// 
    match(where("hotelCode").is("0360")), // 
    sort(Direction.DESC, "confirmationNumber", "timestamp"), // 
    group("confirmationNumber") // 
     .first("timestamp").as("timestamp") //     
     .first(Aggregation.ROOT).as("reservationImage") // 
); 
+0

많은 도움을 주셔서 감사합니다 – Chessman