如何按时间戳将mondoDB文档数据分组为每季度/每半年一次

时间:2017-06-02 11:51:38

标签: mongodb mongoose mongodb-query aggregation-framework


 我正在使用MongoDB 3.2,我要求按照季度和半年度将文档分组。文档结构就像

{
    "_id" : ObjectId("59312c59bf501118aea587b2"),
    "timestamp" : ISODate("2012-01-01T01:00:00Z"),
    "value" : 20,
    "uniqueId" : ObjectId("59312c59bf501118aea58a6d")
},
{
    "_id" : ObjectId("59312c59bf501118aea587b3"),
    "timestamp" : ISODate("2012-02-01T01:00:00Z"),
    "value" : 20,
    "uniqueId" : ObjectId("59312c59bf501118aea58a6d")
},
{
    "_id" : ObjectId("59312c59bf501118aea587b4"),
    "timestamp" : ISODate("2012-05-01T01:00:00Z"),
    "value" : 20,
    "uniqueId" : ObjectId("59312c59bf501118aea58a6d")
},
{
    "_id" : ObjectId("59312c59bf501118aea587b5"),
    "timestamp" : ISODate("2012-06-01T01:00:00Z"),
    "value" : 20,
    "uniqueId" : ObjectId("59312c59bf501118aea58a6d")
}

我需要按时间戳每季度或每半年对文档进行分组,我需要对值进行求和。季度的结果应如下所示

{
    "timestamp" : ISODate("2012-01-01T01:00:00Z"),
    "value" : 40
}, 
{
    "timestamp" :  ISODate("2012-05-01T01:00:00Z"),
    "value" : 90
}

我可以帮助我如何实现这一目标以及半年一次。

1 个答案:

答案 0 :(得分:1)

您可以按季度汇总文档,但每个季度的计算第一个日期应在客户端进行:

db.yourCollection.aggregate([
   {
       $group: {
           _id: {
               year: {$year: "$timestamp"},
               quarter: {$ceil: {$divide:[{$month:"$timestamp"}, 3]}}
               },
           value: {$sum:"$value"}
        }        
    },
    { $project: { _id: 0, year: "$_id.year", quarter: "$_id.quarter", value: 1 } },
    { $sort: { year: 1, quarter: 1 } }
])

输出:

{
    "year" : 2012,
    "quarter" : 1,
    "value" : 40
}
,
{
    "year" : 2012,
    "quarter" : 2,
    "value" : 40
}

如果您想要半年报告,然后按3分组,则应使用6除法。