我目前有一个类似于此定义的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
答案 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
,这为我提供了所需的数据。
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
感谢您提出的所有建议,希望这有助于他人。