我正在使用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
}
我可以帮助我如何实现这一目标以及半年一次。
答案 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
除法。