组条目并获取组内的最低和最高值

时间:2017-02-09 12:07:32

标签: mongodb

我有一个包含类似于此的数据的集合:

{ 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 }

1 个答案:

答案 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"}
        }
    }
]);