获取DateTime为15米间隔的数据

时间:2014-09-22 15:19:44

标签: ruby mongodb mongodb-query mongoid aggregation-framework

我目前有一个类似于此定义的Entry模型:

    field :var_name, type: String
    field :var_data, type: String
    field :var_date, type: DateTime

我有全天生成的数据,并被要求以15分钟的间隔返回数据报告。 DataTime字段var_date每小时间隔为15分钟的所有条目。即12:00 12:15 12:30 12:45

我有一种感觉,这可能很简单,但目前很难用它,任何人都可以帮忙。

我在var_date中的一些示例数据是这样的:

    2014-09-18T05:00:00+00:00
    2014-09-18T05:05:00+00:00
    2014-09-18T05:10:00+00:00
    2014-09-18T05:15:00+00:00
    2014-09-18T05:20:00+00:00
    2014-09-18T05:25:00+00:00

2 个答案:

答案 0 :(得分:1)

MongoDB aggregation framework是您的答案。您可以使用纪元时间戳作为输出值,也可以接受常规日期聚合运算符:

假设此处有一个名为Entry的“类”,请使用.collection访问器来获取底层驱动程序函数。

可以使用date aggregation operators

来完成
Entry.collection.aggregate([
    { "$group" => {
        "_id" => {
            "dayOfYear" => { "$dayOfYear" => "$var_date" },
            "interval" => {
                "$subtract" => [
                    { "$minute" => "$var_date" },
                    { "$mod" => [
                       { "$minute" => "$var_date" },
                       15
                    ]}
                ]
            }
        },
       "count" => { "$sum" => 1 }
    }}
])

或者在基本的“纪元时间戳”形式中,通过从初始纪元值中减去当前日期对象值以表示数字形式的时间戳:

Entry.collection.aggregate([
    { "$group" => {
        "_id" => {
            "$subtract" => [
                { "$subtract" => [ "$var_date", DateTime.new(1970,1,1) ] },
                { "$mod" => [
                    { "$subtract" => [ "$var_date", DateTime.new(1970,1,1) ] },
                    1000 * 60 * 15
                ]}
            ]
        },
        "count" => { "$sum" => 1 }
    }}
 ])

因此,在每种情况下,用于分组的_id代表一小时内的15分钟间隔,并且您希望包含的任何字段都应用于"grouping operators"以实现总计或其他功能,按照“计算”期间内事件的例子。

无论如何,您需要查看聚合框架运算符,特别是$group作为累积结果的管道阶段。

答案 1 :(得分:0)

解释


我最终以一种更简单的方式代码执行此操作,今天早上几个小时后尝试使用另一个答案中建议的MongoDB聚合框架。

不知道为什么我昨天没有想到它,这可能效率不高(会喜欢这方面的建议)但基本上对于每个Entry我只是检查var_date字段的分钟看它是否匹配任何15分钟的间隔。

0, 15, 30 or 45

如果确实如此,我将其添加到@entries15min,这为我提供了所需的数据。

代码I最终以

结束
entries = Entry.all.order('var_date ASC')

@entries15min = []

entries.each do |entry|
  if [0,15,30,45].include? entry.var_date.min
    @entries15min << entry
  end
end

感谢您提出的所有建议,希望这有助于他人。