2015-11-27 39 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

相關問題