Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 获取DateTime为15米间隔的数据_Ruby_Mongodb_Mongodb Query_Mongoid_Aggregation Framework - Fatal编程技术网

Ruby 获取DateTime为15米间隔的数据

Ruby 获取DateTime为15米间隔的数据,ruby,mongodb,mongodb-query,mongoid,aggregation-framework,Ruby,Mongodb,Mongodb Query,Mongoid,Aggregation Framework,我目前有一个类似以下定义的条目模型: field :var_name, type: String field :var_data, type: String field :var_date, type: DateTime 我整天都在生成数据,并被要求每隔15分钟返回一份数据报告。DataTime字段var_date每隔15分钟显示一次的所有条目。i、 e 12:00 12:15 12:30 12:45 我有一种感觉,这可能是简单的,但有一个艰难的时刻与它,请任何人都可以

我目前有一个类似以下定义的条目模型:

    field :var_name, type: String
    field :var_data, type: String
    field :var_date, type: DateTime
我整天都在生成数据,并被要求每隔15分钟返回一份数据报告。DataTime字段var_date每隔15分钟显示一次的所有条目。i、 e 12:00 12:15 12:30 12:45

我有一种感觉,这可能是简单的,但有一个艰难的时刻与它,请任何人都可以帮助

我拥有的var_日期中的一些示例数据如下:

    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
MongoDB就是你的答案。您可以使用历元时间戳作为输出值,也可以接受常规日期聚合运算符:

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

这可以通过以下方式完成:

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

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 }
    }}
 ])
因此,在每种情况下,此处用于分组的
\u id
表示一小时内的15分钟间隔,并且应用您希望包括的任何字段,以实现总计或其他功能,如周期内“计数”事件的示例

无论如何,您需要研究聚合框架操作符,特别是作为累积结果的管道阶段。

解释
今天早上,我尝试使用MongoDB聚合框架(如另一个答案中所建议的)几个小时后,我以一种更简单的方式完成了这项工作

不知道为什么我昨天没有想到它,这可能没有那么有效(希望得到建议),但基本上对于每个
条目
,我只是检查
var_date
字段的分钟数,看看它是否匹配任何15分钟的间隔

0、15、30或45

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

我最后得到的代码
entries=Entry.all.order('var\u date ASC')
@第15分钟=[]
条目。每个do |条目|
如果[0,15,30,45],是否包括?entry.var_date.min

@开始15分钟您将生成什么报告?最简单的例子就是,你可以用模运算符和where子句。第一个过程是从日期时间戳中提取时间。然后为每个间隔创建模运算。为什么不使用
crontab
?@dddd1919我在每天结束时得到一批数据,必须对其进行排序。@wdberkeley该报告只是一个变量名称、变量数据、变量日期的列表,其中变量日期的时间间隔为15分钟,即一小时。i、 e小时后0、15、30或45分钟。一个示例输出是:
处理时间133 2014-09-18T05:15:00+00:00
谢谢您的回答,我无法按需要完成此操作。聚合框架似乎非常强大。今天早上我用这个例子作为出发点,但是想到了一个更简单的方法来获得我需要的结果,我已经在我自己的答案中发布了这个方法。关于Mongodb更深层次的功能,我想我还有很多东西要学习。@KevinMann我基本上建议的是“你真的想要你所建议的作为可能的答案吗?”我不认为你想要。如果您确实想要定时分组间隔,那么您希望它们是一致的,并且基于实际小时间隔。您也不希望像代码所做的那样在应用程序客户机上进行这种处理。在我这么多年的工作中,大家都认为“数据库”服务器比应用服务器更强大。这也扩展到了“集群/分片”环境。让“数据库”来完成这项工作。这很聪明。@KevinMann只需对帖子的“评论”限制再加一条评论。关键是“看起来”更少的代码行几乎从来没有比这更有效。花了足够的时间对汇编程序进行编程,知道这是真的。谢谢你让数据库做这项工作听起来是个好建议。我确实希望在00、15、30和45分钟后得到这个特定项目的结果。它基于在这些时隙采集数据样本。我知道代码行数少并不能提高效率,这就是为什么我在我的回答中征求意见,你的评论会对此有所帮助。我将研究在数据库级别做更多的工作。@KevinMann这里的模运算符意味着这个数字可以被15的因子“整除”。所以15、30和45都能用。这是有意义的,因为15实际上是从0到15的分组。如果你现在明白了这是怎么做到的。虽然这是解决我特定问题的答案,而且考虑到我工作的环境,我相信尼尔·伦恩的答案可能会是一个更好的答案。但是,我还没有根据这个答案创建一个有效的解决方案,所以我知道,将此标记为答案可以解决我的问题并限制数据库访问。
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 }
    }}
 ])
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