在mongoose聚合框架中按日期排序

ArV*_*Van 12 sorting mongoose aggregation-framework

我正在使用mongoose在nodejs + mongodb项目上工作.现在我遇到了一个我不知道答案的问题.我正在使用聚合框架来获得分组结果.分组在不包括时间数据字段的日期完成,如:"2013 02 06".代码如下所示:

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: {
                        year: "$_id.year",
                        month:"$_id.month",
                        day:"$_id.day"
                },
                count: 1,
                _id: 0
            }}
        ], callback);
Run Code Online (Sandbox Code Playgroud)

分组结果是完美的,除了它们没有排序.以下是输出示例:

[
    {
        count: 1,
        date: {
            year: 2013,
            month: 2,
            day: 7
        }
    },
    {
        count: 1906,
        date: {
            year: 2013,
            month: 2,
            day: 4
        }
    },
    {
        count: 1580,
        date: {
            year: 2013,
            month: 2,
            day: 5
        }
    },
    {
        count: 640,
        date: {
            year: 2013,
            month: 2,
            day: 6
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

我知道排序是通过添加这个来完成的:{$sort: val}.但是现在我不确定应该是什么,val因此结果将按日期排序,因为我的分组键是构成日期的3个值的对象.有谁知道如何实现这一目标?

编辑 尝试了这个,它的工作:)

{$sort: {"date.year":1, "date.month":1, "date.day":1}}

ArV*_*Van 10

看来这个问题有一个非常简单的答案:)只需要按照这样的多个nesteed列进行排序:

{$sort: {"date.year":1, "date.month":1, "date.day":1}}
Run Code Online (Sandbox Code Playgroud)


kno*_*ody 5

我遇到了同样的问题,谢谢你的回答.但我发现你可以用更少的代码获得相同的结果

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: "$_id", // so this is the shorter way
                count: 1,
                _id: 0
            }},
            {$sort: {"date": 1} } // and this will sort based on your date
        ], callback);
Run Code Online (Sandbox Code Playgroud)