如何在mongodb中按月对文档进行分组?

如何在mongodb中按月对文档进行分组?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在mongodb中收集了一组事务数据,如下所示: [ {timestamp: ISODate("2015-11-10T11:33:41.075Z"), nominal: 25.121}, {timestamp: ISODate("2015-11-22T11:33:41.075Z"), nominal: 25.121}, {timestamp: ISODate("2015-11-23T11:33:41.075Z"), nominal: 26.121}, {timestam

我在mongodb中收集了一组事务数据,如下所示:

[
   {timestamp: ISODate("2015-11-10T11:33:41.075Z"), nominal: 25.121},
   {timestamp: ISODate("2015-11-22T11:33:41.075Z"), nominal: 25.121},
   {timestamp: ISODate("2015-11-23T11:33:41.075Z"), nominal: 26.121},
   {timestamp: ISODate("2015-12-03T11:33:41.075Z"), nominal: 30.121},
]
如何使用mongodb的aggregate()计算每月的总交易量? 我试着用

db.getCollection('transaction').aggregate([
  { $group: {_id: "$timestamp", total: {$sum: "$nominal"} } }
])
它失败了,因为我使用了
时间戳
而不是
月份
。我不想将
月份的另一个字段添加到事务数据中。我考虑为$group pipeline定制一个返回月值的函数。
可能吗?如果是,怎么做

您需要一个初步阶段,在这个阶段中,您可以使用操作符返回“月份”

db.transaction.aggregate([
{“$project”:{
“名义上”:1,
“月”:{“$month”:“$timestamp”}
}}, 
{“$组”:{
“_id”:“$month”,
“总计”:{“$sum”:“$nominal”}
}}
])
返回:

{u id:12,“总计:30.121}
{u id:11,“总计:76.363}

只有在数据库中只有不到12个月的历史记录时,此功能才能正常工作。正确的实现应该返回年-月数据。@sorin来自mongodb 3.0+您可以使用$dateToString而不是$month,您可以传递格式(ref:),或者如果您低于3.0,您可以通过黑客攻击将日期转换为连接版本。您需要两个项目阶段,一个是分别格式化$month和$year。然后在另一个阶段使用$concat和concat这两个新字段。别忘了在年和月上使用substr,因为不能计算整数。