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

    {
            "_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} }
])

我try 过切换排序顺序(例如:buildProjectName、day、month、year),但如果日期不符合顺序,我总是得到相同的结果:

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

推荐答案

你要排序的字段是_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
    } }
])

Mongodb相关问答推荐

在MogoDB中按时间间隔分组、统计文档和获取间隔时间

如何对嵌套在另一个数组中的数组中的字段执行查找?

我无法将文档发送到我的MongoDB集合,因为它告诉我使文档无效

MongoDB对两个串联数组进行排序

MongoDB:如何获取多个$indexOfArray值?

如何使用内部数组中的值更新文档

使用特定关键字和邻近度进行查询和过滤

如何在 MongoDB 中对字段进行自定义排序

MongoDB:嵌套数组计数+原始文档

Java MongoDB FindOne 获取最后插入的记录

在 MongoDB 中创建简短、唯一的对象 ID

MongoDB:单个数据库处理程序的 >5 个打开连接

如何在 mongo JavaScript shell 中中止查询

MongoDB聚合排序不起作用

TypeError: object of type 'Cursor' has no len()

如何在 Rails 中混合使用 mongodb 和传统数据库?

如何使用 Pymongo 在 MongoDB 中 Select 单个字段?

MongoDB如何判断是否存在

Mongoose:Model.create 和 Collection.insert 有什么区别

mongo中的稀疏索引和空值