2016-11-23 5 views
1

次の構造名があります。私はユーザーによるディスカッションの最後のメッセージを取得したい。私は、不完全なSpring MongoDBのクエリに続いて試してみましたが、ディスカッションごとに(lastmodifieddateでソートされた)1つのメッセージをフェッチする方法や、会話の最後のメッセージの受信者であるディスカッションを見つける方法を教えてください。最後のサブ要素をフェッチする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)); 
関連する問題