示例文档
[
{time: ISODate('2015-07-04T03:12:00.000Z')},
{time: ISODate('2015-07-04T03:15:00.000Z')},
{time: ISODate('2015-07-04T04:59:00.000Z')},
{time: ISODate('2015-07-04T05:01:00.000Z')}
]
预期输出
[
{
'_id': 'groupA',
'count': 2,
'min': ISODate('2015-07-04T03:12:00.000Z'),
'max': ISODate('2015-07-04T03:15:00.000Z')
},
{
'_id': 'groupB',
'count': 2,
'min': ISODate('2015-07-04T04:59:00.000Z'),
'max': ISODate('2015-07-04T05:01:00.000Z')
}
]
是否可以使用MongoDB聚合框架对在一定时间范围内发生的文档进行分组?您如何建模$ group调用以将示例文档转换为预期输出?
我试图将时间转换为毫秒,然后使用模数创建时间桶,但这会产生具有任意边界的区间。例如,2015-07-04T04:59:00.000Z将在2015-07-04T05:01:00.000Z的单独组中,即使它们应该组合在一起。
答案 0 :(得分:0)
根据您要分组的时间范围,您可以使用MongoDB Date Aggregation functions来实现此目的。
使用这些功能,您可以投影或分组日期/时间的单独元素,并在需要时进行组合。
使用您的示例数据,以下聚合管道将按小时对输入进行分组:
{ '$group' : {
'_id' : {
'document_day' : { '$dayOfMonth' : '$time' },
'document_month' : { '$month' : '$time'},
'document_year' : { '$year' : '$time'},
'document_hour' : { '$hour' : '$time' }
},
'count' : { '$sum' : 1 },
'min' : { '$min' : '$time'},
'max' : { '$max' : '$time'}
}
},
{
'$project' : {
'_id' : 0,
'count' : '$count',
'min' : '$min',
'max' : '$max'
}
}
并且会给你这个结果:
{
"count" : 1,
"min" : ISODate("2015-07-04T05:01:00Z"),
"max" : ISODate("2015-07-04T05:01:00Z")
},
{
"count" : 1,
"min" : ISODate("2015-07-04T04:59:00Z"),
"max" : ISODate("2015-07-04T04:59:00Z")
},
{
"count" : 2,
"min" : ISODate("2015-07-04T03:12:00Z"),
"max" : ISODate("2015-07-04T03:15:00Z")
}
不确定这是否属于您之后的情况,但我没有必要的代表将此留作评论。
答案 1 :(得分:0)
我会做以下事情: