2015-11-27 40 views
4

我有交易数据的集合在MongoDB中,像这样的:如何按月在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的骨料()每个月要计算我总交易? 我试图用

db.getCollection('transaction').aggregate([ 
    { $group: {_id: "$timestamp", total: {$sum: "$nominal"} } } 
]) 

它失败了,因为我用timestamp,而不是month。我不想为交易数据添加month的另一个字段。我想为$ group管道定制一个返回月份值的函数。 这可能吗?如果是这样,怎么样?

回答

3

您需要初步的$project阶段,您可以使用$month运算符返回“月”。

db.transaction.aggregate([ 
    { "$project": { 
     "nominal": 1, 
     "month": { "$month": "$timestamp" } 
    }}, 
    { "$group": { 
     "_id": "$month", 
     "total": { "$sum": "$nominal" } 
    }} 
]) 

将返回:

{ "_id" : 12, "total" : 30.121 } 
{ "_id" : 11, "total" : 76.363 } 
+3

这将很好地工作只有当你只有不到12个月的历史数据库。正确的实现应该返回年份数据。 – sorin

+0

@sorin from mongodb 3.0+您可以使用$ dateToString而不是$ month,并且您可以传递格式(参考:https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/) – axelvnk

+0

或者if你低于3.0你可以破解你的方式到日期的连接版本。您需要2个项目阶段,一个分别格式化$ month和$ year。然后另一个阶段使用$ concat并且连接两个新字段。不要忘记在年份和月份使用substr,因为你不能连续整数。 – axelvnk

相关问题