2016-11-23 1 views
1

다음 구조 이름이 있습니다. 토론. 사용자가 토론에서 마지막 메시지를 가져 오려고합니다. 나는 불완전한 Spring MongoDB 질의를 시도했는데, 토론마다 하나의 메시지 (lastmodifieddate로 정렬)를 가져 오는 방법 또는 대화에서 마지막 메시지의 수신자 인 토론을 찾는 방법을 알려 주실 수 있습니까?Mongodb 집계 (Java/Spring) 쿼리를 사용하여 마지막 하위 요소를 가져옵니다.

Aggregation aggr = newAggregation(
      match(Criteria.where("participants").regex(Pattern.compile(userid))), 
       unwind("messages"), 
       match(new Criteria().orOperator(Criteria.where("messages.touserId").is(userid),Criteria.where("messages.fromuserId").is(userid))), 
       sort(Direction.DESC, "messages.lastModifiedDate"), 
       group("_id").push("messages").as("messages"), 
       project("_id","messages") 
       ); 

{ 
    "_id": { 
    "$oid": "57c2d7c8e4b0bcf181b7db0a" 
    }, 
    "_class": "xxxxx", 
    "participants": [ 
    "56893b22e4b0e8d1c6a25783", 
    "56893bb6e4b0e8d1c6a25785", 
    "577c2f6ee4b09ccb44d14415" 
    ], 
    "messages": [ 
    { 
     "_id": { 
     "$oid": "57c2d7c8e4b0bcf181b7db08" 
     }, 
     "fromuserId": "577c2f6ee4b09ccb44d14415", 
     "fromuser": "xxxx", 
     "touserId": "56893b22e4b0e8d1c6a25783", 
     "touser": "Bloreshop1", 
     "message": "Check Product Price", 
     "isMute": false, 
     "index": 1, 
     "createDate": { 
     "$date": "2016-08-28T12:23:36.037Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-08-28T12:23:36.037Z" 
     }, 
     "createdBy": "xxxx", 
     "lastModifiedBy": "xxxxx" 
    }, 
    { 
     "_id": { 
     "$oid": "57c2d7c8e4b0bcf181b7db09" 
     }, 
     "fromuserId": "577c2f6ee4b09ccb44d14415", 
     "fromuser": "xxxxxx", 
     "touserId": "56893bb6e4b0e8d1c6a25785", 
     "touser": "Bloreshop2", 
     "message": "Check Product Price", 
     "isMute": false, 
     "index": 2, 
     "createDate": { 
     "$date": "2016-08-28T12:23:36.302Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-08-28T12:23:36.302Z" 
     }, 
     "createdBy": "xxxxx", 
     "lastModifiedBy": "xxx" 
    } 
    ], 
    "discussionTopic": "Check Product Price", 
    "messageCount": 2, 
    "createDate": { 
    "$date": "2016-08-28T12:23:36.318Z" 
    }, 
    "lastModifiedDate": { 
    "$date": "2016-08-28T12:23:36.318Z" 
    }, 
    "createdBy": "xxxx", 
    "lastModifiedBy": "xxxxx" 
} 
+0

지원합니다. 이 사용자가 각각 메시지를 보내고 받는지 여부를 나타내는 메시지가 사용자와 사용자에게 있습니다. 그리고 OR 쿼리를 사용하여 사용자가 메시지를 보내거나받는 위치의 메시지를 찾습니다. 이 사용자가 마지막 메시지를받는 메시지에 관심이 있습니다. – Debopam

+0

아래의 Veerams 응답은 기술적 인 관점에서 문제를 해결할 수 있지만 문제의 최적의 해결책은 문서에 마지막 메시지를 중복하여 보관하고 새 메시지가 추가 될 때마다 $ set을 통해 업데이트하는 것입니다. 가능한 경우 집계를 피하십시오. – mtj

답변

2

당신은 $slice(aggregation)을 찾고 있습니다. 현재 릴리스 1.9.5 버전은 슬라이스를 지원하지 않습니다.

Aggregation aggr = newAggregation(
     match(Criteria.where("participants").regex(Pattern.compile(userid))), 
     unwind("messages"), 
     match(new Criteria().orOperator(Criteria.where("messages.touserId").is(userid), Criteria.where("messages.fromuserId").is(userid))), 
     sort(Direction.DESC, "messages.lastModifiedDate"), 
     group("_id").push("messages").as("messages"), 
     project("_id").and("messages").project("slice", 1)); 

출시되지 않은 버전 (2.x) 버전은이 토론에 대한 구조 슬라이스

Aggregation aggr = newAggregation(
     match(Criteria.where("participants").regex(Pattern.compile(userid))), 
     unwind("messages"), 
     match(new Criteria().orOperator(Criteria.where("messages.touserId").is(userid), Criteria.where("messages.fromuserId").is(userid))), 
     sort(Direction.DESC, "messages.lastModifiedDate"), 
     group("_id").push("messages").as("messages"), 
     project("_id").and("messages").slice(1));