你如何从 Mongo 日期字段中获取 DayHours?

Posted

技术标签:

【中文标题】你如何从 Mongo 日期字段中获取 DayHours?【英文标题】:How do you get DayHours from Mongo date field? 【发布时间】:2013-11-15 23:53:10 【问题描述】:

我正在尝试在 mongo 聚合函数中按 DayHours 分组以获取过去 24 小时的数据。 例如:如果事件的时间是星期五 6:00,则“DayHour”将是 6-5。 我可以通过以下查询轻松地按小时分组:

db.api_log.aggregate([
     '$group':  
        '_id':  
            '$hour': '$time'
        , 
        'count':  
          '$sum':1 
         
       
    ,
     '$sort' :  '_id': -1  
  ])

我觉得有更好的方法来做到这一点。我已经尝试在 $project 语句中进行连接,但是您只能在 mongo 中连接字符串(显然)。 我实际上只需要按天和小时分组,但是它已经完成了。谢谢。

【问题讨论】:

【参考方案1】:

我假设time 字段包含ISODate。 如果你只想要最后 24 小时,你可以使用这个:

var yesterday = new Date((new Date).setDate(new Date().getDate() - 1));

db.api_log.aggregate(
    $match: time: $gt: yesterday,
    $group: 
        _id: 
            hour: $hour: "$time",
            day: $dayOfMonth: "$time",
        ,
        count: $sum: 1
    
)          

如果您想按天数进行一般分组,您可以使用:

db.api_log.aggregate(
    $group: 
        _id: 
            hour: $hour: "$time",
            day: $dayOfMonth: "$time",
            month: $month: "$time",
            year: $year: "$time"
        ,
        count: $sum: 1
    
)

【讨论】:

【参考方案2】:

这本身也不是一个答案(我现在没有 mongodb 来提供答案),但我认为你不能仅仅使用聚合框架来做到这一点(我可能错了,所以我会解释自己)。

您可以使用.getTimestamp 方法从mongoId 获取日期和时间信息。您无法在 mongo 查询中输出此信息的问题(db.find(,_id.getTimestamp) 之类的东西不起作用)。您也不能按此字段搜索(使用$where 子句除外)。

因此,如果可以实现,只能使用 mapreduce 来完成,在 reduce 函数中,您根据 getTimestamp 的输出进行分组。

如果这是您要经常执行的查询,我建议您将date 字段添加到您的文档中,因为使用此字段您将能够正确聚合您的数据,并且您可以使用 indeces 不扫描所有您的收藏(就像您对 $sort -1 所做的那样,但对于 $match 仅是大于 current date - 24 hours 的部分)。

我希望即使没有代码也能提供帮助。如果没有人能够回答这个问题,我明天会尝试玩它。

【讨论】:

以上是关于你如何从 Mongo 日期字段中获取 DayHours?的主要内容,如果未能解决你的问题,请参考以下文章

mongo-> 如何从两个不同的集合中获取日期时间 desc 顺序的记录

如何从 mongo 记录中获取缺失的字段

从 MySQL 到 Mongo 数据导出:如何保存创建日期?

如何使用 Mongo 存储库两次查询同一字段?

在提供的多个日期范围之间获取 mongo 结果

如何从 Sqlite ( android ) 中的 datetime 字段获取日期