2016-11-23 180 views
1

我有以下结构名称讨论。我想在用户讨论中获取最后一条消息。我尝试了以下不完整的Spring MongoDB查询,请允许我告诉我如何仅根据讨论获取一条消息(按lastmodifieddate排序),或者找到用户是对话中最后一条消息的接收者的讨论。Mongodb Aggregate(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));