2016-11-23 3 views
1

У меня есть следующие названия структур. Обсуждение. Я хочу получить последнее сообщение в обсуждении пользователем. Я попытался выполнить неполный запрос Spring MongoDB, не могли бы вы сообщить мне, как получить только одно сообщение (отсортированное по последнему моменту) для обсуждения или найти обсуждения, в которых пользователь является получателем последнего сообщения в разговоре.запрос 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)); 

Unreleased Version (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)); 
Смежные вопросы