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

如何在MongoDB中按月对结果进行排序,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个联系人集合,其文档与此类似: { Name: "John Doe", BirthDate: ISODate("1980-03-12T00:00:00.000Z"), Address: "..." } 我需要获取所有文档,按照出生日期字段的月份部分进行排序。 结果必须包括文档的所有字段。这样做的目的是向用户显示哪些联系人每个月都有生日 我试图构造一个聚合,但不太清楚如何使用$month操作符对BirthDate字段进行排序 也许我可以使用$group,但是我如何使它显示文档的所有字段呢?

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

{ Name: "John Doe", BirthDate: ISODate("1980-03-12T00:00:00.000Z"), Address: "..." }
我需要获取所有文档,按照出生日期字段的月份部分进行排序。 结果必须包括文档的所有字段。这样做的目的是向用户显示哪些联系人每个月都有生日

我试图构造一个聚合,但不太清楚如何使用
$month
操作符对BirthDate字段进行排序


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

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

我正在使用我对你的领域的知识的子集,但一般概念是在阶段中定义所有领域,加上额外的领域:

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,
    }},

])
如果您需要执行更复杂的操作,这将涉及某种形式的分组或其他操作,则将文档保存在
\u id
中,只要您正在对整个文档进行分组:

db.collection.aggregate([

   // Save your document in the `_id` field
    {"$project": {
        _id: {
            _id: "$_id",
            "Name": 1,
            "BirthDate": 1,
            "Address": 1
        }
    }},
这里还发布了一些关于此用法的示例:


我认为应该这样做,你的例子很好。但是,我需要手动投影所有字段的事实困扰着我。如果以后我在文档中添加更多的字段,或者删除一些字段,我将不得不找到所有在该集合上进行投影的聚合并修复它们。我希望找到一种方法自动包含所有字段。@Yev Anoying yes。从2.6开始,将有一个
$$ROOT
变量,它是给定管道阶段中整个文档的别名。目前还没有其他方法来解决这个问题。@Yev作为一个原则,我通常不会对这些语句进行编码(演奏/设计时除外),但它们是在真实世界的代码中生成的。这就是我如何处理你所描述的。好的,很高兴知道。然后我将手动执行,并等待2.6。您可以发布到$$ROOT文档的链接吗?我在MongoDB的网站上找不到它。@Yev2.6是版本。开发分支是2.5.x。准备好了就可以了。对于$$ROOT