在MongoDB中进行GROUP BY之前进行排序

时间:2014-05-16 04:50:04

标签: mongodb aggregation-framework database

我有一个用于bug跟踪的mongo数据库。它包含2个集合:

项目

{
    "_id": 1,
    "name": "My Project"
}

错误

{
    "_id": 1,
    "project": 1,
    "title": "we have a bug",
    "timestamp": 1400215183000
}

在仪表板上,我想显示每个项目的最新错误 - 最多总共10个。 所以基本上,在执行 GROUP BY "project"字段时,我需要确保它始终选择最新的错误(通过"timestamp"进行预排序)。

我不确定如何将排序和分组结合在一起,谢谢。

1 个答案:

答案 0 :(得分:2)

为了获得"最新的"每个项目的错误,同时限制为10个结果:

db.collection.aggregate({
    { "$sort": { "timestamp": -1, "project": 1 } },
    { "$group": {
        "_id": "$project",
        "bug": {
            "$first": {
                "_id": "$_id",
                "title": "$title",
                "timestamp": "$timestamp"
            }
        }
    }},
    { "$limit": 10 }
})

因此,排序是通过时间戳和项目(作为优化)完成的,然后执行$group$limit。这里的分组只是关注"边界"使用$first,然后返回您可能需要或不需要的所有其余文档。

尝试实际限制您的"时间戳"首先使用$match进行范围优化。