次の集計を取得しました。
すべてのメッセージをスキャンして docId でグループ化し、各グループで最後に更新されたメッセージのみを返します。
db.getCollection('Messages').aggregate([ { '$match': { docType: 'order' }}, { '$sort': { updatedAt: -1 } }, { '$group': { _id: '$docId', content: { '$first': '$content' }}}])
戻ります-
[
{
"_id" : "some id1",
"content" : "some msg1
}
/* 11 */
{
"_id" : "some id2",
"content" : "some msg2"
}
...
]
意図したとおりに機能しています(最適化についてはわかりません)。
しかし、その上にもう 1 つ追加する必要があります。
UI でドキュメントのリストを取得し、それぞれの最新のメッセージのみを表示する必要があります。ただし、ページングも取得したため、XXXXXX ドキュメントの最後のメッセージを表示する必要はありませんが、1 ページのみです。
だから基本的にこのようなもの -
.find({'docId':{$in:['doc1', 'doc2', 'doc3'...]}}) - if the page had 3 items
しかし、それをすべて組み合わせる方法がわかりません。
Message sample:
{
"_id": "11111"
"docType": "order",
"docId": "12345", - this is not unique there can be many messages for 1 docId
"content": "my message",
"updatedAt" "01/01/2020..."
}