1

次の構造名ディスカッションがあります。ユーザーによるディスカッションの最後のメッセージを取得したいと考えています。不完全な Spring MongoDB クエリをたどってみました。ディスカッションごとに 1 つのメッセージ (lastmodifieddate でソート) を取得する方法、またはユーザーが会話の最後のメッセージの受信者であるディスカッションを見つける方法を教えてください。

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

1 に答える 1

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));
于 2016-11-23T23:31:56.873 に答える