Mongodb 如何简化此聚合框架查询(使用日期格式和比较)

Mongodb 如何简化此聚合框架查询(使用日期格式和比较),mongodb,aggregation-framework,Mongodb,Aggregation Framework,我已经有了一个关于我需要什么的工作查询(包括在下面),但我忍不住觉得必须有更好的方法来完成这一点。我的需求相当简单,但生成的查询本身就是“眼出血”代码的定义 下面是我们正在迭代的示例文档(删除了不相关的属性): 我对查询的要求如下: 仅在已创建>已更新的内容上匹配 在创建的字段的YYYY-MM值上分组,并减少到一个计数 输出应如下所示: { "count": 93592, "month": "2014-06" }, { "count": 81629, "month": "2014-07" },

我已经有了一个关于我需要什么的工作查询(包括在下面),但我忍不住觉得必须有更好的方法来完成这一点。我的需求相当简单,但生成的查询本身就是“眼出血”代码的定义

下面是我们正在迭代的示例文档(删除了不相关的属性):

我对查询的要求如下:

  • 仅在
    已创建>已更新的内容上匹配
  • 在创建的
    字段的
    YYYY-MM
    值上分组,并减少到一个计数
  • 输出应如下所示:
    { "count": 93592, "month": "2014-06" },
    { "count": 81629, "month": "2014-07" },
    { "count": 126183, "month": "2014-08" },
    ...
    我的问题:这个查询可以简化吗?如果可以,如何简化

    谢谢

    试试这个:

    db.test.aggregate([
        { "$project" : { 
            "cmpDates" : { "$cmp" : ["$created", "$updated"] }, 
            "createdYear" : { "$year" : "$created" }, 
            "createdMonth" : { "$month" : "$created" } 
        } }, 
        { "$match" : { "cmpDates" { "$ne" : 0 } } },
        { "$group" : { 
            "_id" : { "y" : "$createdYear", "m" : "$createdMonth" }, 
            "count" : { "$sum" : 1 } 
        } }
    ])
    

    最大的区别是我使用了一个复合键作为组,所以我将这对
    (年、月)
    分组,而不是构造一个字符串值
    YYYY-MM
    ,以实现相同的目的。

    是的,放松
    YYYY-MM
    要求似乎有帮助。另外,我没有意识到你可以把
    $group
    \u id变成这样的对象,这非常方便。此查询确实需要重新输入
    cmpDates:{$ne:0}
    $match
    ,但除此之外,其他操作都很正常。谢谢你的帮助!哎呀,这是非常重要的一步。很抱歉。我把它编辑成了答案。
    db.Thing.aggregate([
        { $project: {
            cmpDates: { $cmp: ['$created', '$updated'] },
            created: '$created'
        }},
        { $match: {
            cmpDates: { $ne: 0 }
        }},
        { $project: {
            month: {
                $concat: [
                    { $substr: [ { $year: '$created' }, 0, 4 ] },
                    '-',
                    { $cond: [
                        { $lte: [ { $month: '$created' }, 9 ] },
                        { $concat: [
                            '0',
                            { $substr: [ { $month: '$created' }, 0, 2 ] }
                        ]},
                        { $substr: [ { $month: '$created' }, 0, 2 ] }
                    ] }
                ]
            },
            _id: 0
        }},
        { $group: {
            _id: '$month',
            count: { $sum: 1 }
        }},
        { $project: {
            month: '$_id',
            count: 1,
            _id: 0
        }},
        { $sort: { month: 1 } }
    ]);
    
    db.test.aggregate([
        { "$project" : { 
            "cmpDates" : { "$cmp" : ["$created", "$updated"] }, 
            "createdYear" : { "$year" : "$created" }, 
            "createdMonth" : { "$month" : "$created" } 
        } }, 
        { "$match" : { "cmpDates" { "$ne" : 0 } } },
        { "$group" : { 
            "_id" : { "y" : "$createdYear", "m" : "$createdMonth" }, 
            "count" : { "$sum" : 1 } 
        } }
    ])