0

次の集計を取得しました。

すべてのメッセージをスキャンして 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..."
    
    }
4

1 に答える 1