我有一个包含类似于此的数据的集合:
{ processName: "TestImport", processId: 1, message: "Started", time: 1486609206370 }
{ processName: "TestImport", processId: 1, message: "Finished",
time: 1486609207388 }
{ processName: "TestImport", processId: 2, message: "Started", time: 1486779281773 }
{ processName: "TestImport", processId: 2, message: "Finished",
time: 1485992810029}
{ processName: "SomeOtherImport", processId: 1, message: "Started", time: 1486779281773 }
{ processName: "SomeOtherImport", processId: 1, message: "Finished",
time: 1487993829281 }
因此它基本上包含来自不同进程的多条消息。每个流程都通过processName
和连续processId
来识别。
现在我想创建一个选择最新进程的查询,所以ID最高的进程会返回最早和最后一条消息的时间,以及最后一条消息。
我已经接近这一点,使用aggregate
并将其分组如下:
db.status_history.aggregate([
{
$group: {
_id: {
name: "$processName",
id: "$processId"
},
processId: {
$last: "$processId"
},
message: {
$last: "$message"
},
startTime: {
$first: "$time"
},
endTime: {
$last: "$time"
}
}
}]);
但是像这样,我不仅获得每个进程具有最高ID的条目,而且每个ID都有一个条目(尽管具有正确的值):
{ processName: "TestImport", processId: 1, message: "Finished", startTime: 1486609206370, endTime: 1486609207388 }
{ processName: "TestImport", processId: 2, message: "Finished", startTime: 1486779281773, endTime: 1485992810029 }
{ processName: "SomeOtherImport", processId: 1, message: "Finished", startTime: 1486779281773, endTime: 1487993829281 }
我需要更改哪些内容才能获得最高ID的结果?像这样:
{ processName: "TestImport", processId: 2, message: "Finished", startTime: 1486779281773, endTime: 1486923811716 }
{ processName: "SomeOtherImport", processId: 1, message: "Finished", startTime: 1486779281773, endTime: 1487993829281 }
答案 0 :(得分:1)
第一组可以按名称和ID 应用排序,然后再按按名称分组并选择第一个匹配的信息。
db.status_history.aggregate([
{
$group: {
_id: {
name: "$processName",
id: "$processId"
},
processId: {$last: "$processId"},
message: {$last: "$message"},
startTime: {$first: "$time"},
endTime: {$last: "$time"}
}
},
{$sort:{"_id.name":1, "_id.id":-1}},
{
$group: {
_id: "$_id.name",
processId: {$first: "$processId"},
message: {$first: "$message"},
startTime: {$first: "$startTime"},
endTime: {$first: "$endTime"}
}
}
]);