MongoDB 聚合排序不起作用

标签 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
}

最佳答案

您要排序的字段是 _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 聚合排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265170/

相关文章:

java - 如何使用 Java 驱动程序获取 MongoDB 中嵌入文档数组的特定值

mongodb - 在 Mongo 中填充后如何查询包含相同用户名的所有文档

algorithm - 从长度为 N 的数组中返回前 k 个值的最佳算法

swift - 按字母顺序和降序打印结构中的数组

node.js - NodeJS + Mongoose : Updating all fields on a Mongoose model

python - 如何在python中使用mongoengine在ListField上添加索引?

java - 如何将256个元素的数组检索到mongodb?

c - 为什么这个选择排序代码没有给出正确的输出?

javascript - 使用 JavaScript 对象构建菜单的最有效方式

python - 在Python中的排序字典中查找并计算行中的相同值?