mongodb 聚合 ID 列表

mongodb aggregation with list of ids

我得到了以下聚合:

它扫描所有邮件并按 docId 对它们进行分组,returns 仅在每个组中 最后 更新的邮件。

db.getCollection('Messages').aggregate([ { '$match': { docType: 'order' }}, { '$sort': { updatedAt: -1 } }, { '$group': { _id: '$docId', content: { '$first': '$content' }}}])

哪个returns-

[
{
    "_id" : "some id1",
    "content" : "some msg1
}

/* 11 */
{
    "_id" : "some id2",
    "content" : "some msg2"
}
...
]

它按预期工作(不确定优化)。

但现在我需要在此之上添加另一件事。

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

添加

{ '$match': { _id: { '$in': ["docId1", "docId2"]} }}

最后成功了!

编辑:

或者实际上我认为将它添加为第一个管道可能会更好:

db.getCollection('Messages').aggregate([ { '$match': { docId: { '$in': ["5d79cba1-925b-416b-9408-6f4429d7c107", "8e31c748-c86d-407e-8d83-9810c8e23e3e"]} }}, { '$match': { docType: 'order' }}, { '$sort': { cAt: -1 } }, { '$group': { _id: '$docId', content: { '$first': '$content' }}}])
  • 由于我是动态添加的,所以我最终得到了 2 个 $match 属性。我实际上不太确定使用 $match + $ 和使用 2 个不同的 $match(优化明智)有什么区别。