如何在MongoDB中按月对结果进行排序

时间:2014-02-27 13:07:24

标签: mongodb mongodb-query aggregation-framework

我有一个联系人集合,其文档类似于:

{ Name: "John Doe", BirthDate: ISODate("1980-03-12T00:00:00.000Z"), Address: "..." }

我需要获取所有文档,按 BirthDate 字段的部分排序。 结果必须包括文档的所有字段。这个想法是向用户显示每个月的哪些联系人都有生日。

我尝试构建聚合,但无法弄清楚如何使用$month运算符对 BirthDate 字段进行排序。

也许我可以使用$group,但如何让它显示文档的所有字段?

1 个答案:

答案 0 :(得分:2)

有一个技巧,根据你想做什么,你可以采取几种方法。最简单的是在聚合管道中使用$project

我正在使用子集了解我对你的领域的知识,但一般的概念是在$project阶段定义所有这些,加上附加字段:

db.collection.aggregate([

    // You probably want to do some matching first

    // Project your altered document form with a *new* field for "month"
    {"$project": {
        "Name": 1,
        "BirthDate": 1,
        "Address": 1,
        "month": { "$month": "$BirthDate" }               // Extra field for "month"
    }},

    // Sort by your month value
    {"$sort": { "month": 1 }},

    // Then just clean the extra part from your projection
    // ( if you need to )
    {"$project": {
        "Name": 1,
        "BirthDate": 1,
        "Address": 1,
    }},

])

如果你需要做一些更复杂的事情,那将涉及某种形式的分组或其他操作,只要你做的事情,保存文件在_id喜欢在整个文档上进行分组:

db.collection.aggregate([

   // Save your document in the `_id` field
    {"$project": {
        _id: {
            _id: "$_id",
            "Name": 1,
            "BirthDate": 1,
            "Address": 1
        }
    }},

此处发布了更多示例用法:

How to get back the Original document back after aggregation