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(优化明智)有什么区别。
我得到了以下聚合:
它扫描所有邮件并按 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(优化明智)有什么区别。