MongoDB聚合框架用于对在一个时间范围内发生的文档进行分组?

时间:2015-07-30 18:41:18

标签: mongodb mongodb-query aggregation-framework

示例文档

[
  {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的单独组中,即使它们应该组合在一起。

2 个答案:

答案 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)

我会做以下事情:

  1. 排名你的日期点[12:58,13:01,13:45,13:49]
  2. 取日期点[0min,3min,44min,4min]
  3. 的第一个差异
  4. 定义一个相对阈值(例如,1个标准偏差),用于将差异的日期点分成[[12:58,13:01],[13:45,13:49]]