MongoDB聚合排序不起作用

时间:2014-01-21 17:32:31

标签: mongodb sorting

我在将聚类应用于聚合分组时遇到问题。我的原始数据如下所示:

    {
            "_id" : ObjectId("52deab2fe4b0a491abb54108"),
            "type" : "build",
            "time" : ISODate("2014-01-21T17:15:27.471Z"),
            "data" : {
                    "buildNumber" : 43,
                    "buildDuration" : 997308,
                    "buildProjectName" : "TestABC",
                    "buildResult" : "SUCCESS"
            }
    }

我想首先通过buildProjectName然后将日期排序。这是我的疑问:

db.builds.aggregate([
    { $group: { 
        _id: { 
            month: { $month: "$time" },
            day: { $dayOfYear: "$time" },
            year: { $year: "$time" }, 
            buildProjectName: "$data.buildProjectName", 
        },
        buildDuration: { $avg: "$data.buildDuration" } 
    } },
    { $sort: {buildProjectName: 1, year: 1, month: 1, day: 1} }
])

我已经尝试切换排序顺序(即:buildProjectName,日,月,年),但我总是得到与日期不按顺序相同的结果:

{
        "result" : [
                {
                        "_id" : {
                                "month" : 1,
                                "day" : 20,
                                "year" : 2014,
                                "buildProjectName" : "TestABC"
                        },
                        "buildDuration" : 1170723.5
                },
                {
                        "_id" : {
                                "month" : 1,
                                "day" : 21,
                                "year" : 2014,
                                "buildProjectName" : "TestABC"
                        },
                        "buildDuration" : 2284863.3333333335
                },
                {
                        "_id" : {
                                "month" : 1,
                                "day" : 17,
                                "year" : 2014,
                                "buildProjectName" : "TestABC"
                        },
                        "buildDuration" : 2234662
                }
        ],
        "ok" : 1
}

2 个答案:

答案 0 :(得分:27)

您要排序的字段是_id的一部分,因此您需要将其包含在$sort字段名称中:

db.builds.aggregate([
    { $group: { 
        _id: { 
            month: { $month: "$time" },
            day: { $dayOfYear: "$time" },
            year: { $year: "$time" }, 
            buildProjectName: "$data.buildProjectName", 
        },
        buildDuration: { $avg: "$data.buildDuration" } 
    } },
    { $sort: {
        '_id.buildProjectName': 1, 
        '_id.year': 1, 
        '_id.month': 1, 
        '_id.day': 1
    } }
])

答案 1 :(得分:0)

所以这是对聚合结果进行排序的问题。

这里,您要排序的字段是ID的一部分,因此基本上,您的聚合操作将执行平均值操作,并返回带有2个称为“ _id”和“ buildDuration”的文件的结果集,因为您正在对字段进行排序在“ _id”的内部字段中,您必须按照以下方式定义“排序”属性。

{ $sort: {
        '_id.buildProjectName': 1, 
        '_id.year': 1, 
        '_id.month': 1, 
        '_id.day': 1
    } }

希望这会对您有所帮助。如有任何疑问,请与我联系。