Запрос Mongodb Aggregate (Java/Spring) для получения последнего подэлемента

У меня есть следующие названия структур. Я хочу получить последнее сообщение в обсуждении пользователем. Я попытался выполнить неполный запрос Spring MongoDB, не могли бы вы сообщить мне, как получить только одно сообщение (отсортированное по дате последнего изменения) за обсуждение, или найти обсуждения, в которых пользователь является получателем последнего сообщения в беседе.

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"
}

1 ответ

Решение

Вы ищете $slice(агрегат). Текущая версия 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));
Другие вопросы по тегам