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
\u id变成这样的对象,这非常方便。此查询确实需要重新输入$group
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 } } } ])