首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Mongo字段获得DayHours?

如何从Mongo字段获得DayHours?
EN

Stack Overflow用户
提问于 2013-11-05 06:53:49
回答 2查看 694关注 0票数 1

我试图在mongo聚合函数中按DayHours进行分组,以获取过去24小时的数据。例如:如果事件发生的时间是周五6:00,那么"DayHour“将是6-5。我可以很容易地使用以下查询按小时分组:

代码语言:javascript
运行
复制
db.api_log.aggregate([
    { '$group': { 
        '_id': { 
            '$hour': '$time'
        }, 
        'count': { 
          '$sum':1 
        } 
      } 
    },
    { '$sort' : { '_id': -1 } }
  ])

我觉得有更好的方法可以做到这一点。我已经尝试过在$project语句中连接,但是您只能在mongo中连接字符串(显然)。实际上,我只需要在一天一小时内分组,不管它是怎么做的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-05 08:09:59

我假设time字段包含ISODate。如果您只想持续24小时,可以使用以下内容:

代码语言:javascript
运行
复制
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}
    }}
)          

如果您希望按白天时间进行一般分组,可以使用以下方法:

代码语言:javascript
运行
复制
db.api_log.aggregate(
    {$group: {
        _id: {
            hour: {$hour: "$time"},
            day: {$dayOfMonth: "$time"},
            month: {$month: "$time"},
            year: {$year: "$time"}
        },
        count: {$sum: 1}
    }}
)
票数 1
EN

Stack Overflow用户

发布于 2013-11-05 07:26:36

而且,这本身并不是一个答案(我现在还没有mongodb来给出答案),但是我认为您不能仅仅用聚合框架来完成这个任务(我可能错了,所以我将自己解释一下)。

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

因此,如果有可能实现,则只能使用mapreduce完成,在还原函数中,可以根据getTimestamp的输出对其进行分组。

如果这是您要经常执行的查询,我建议将date字段实际添加到您的文档中,因为使用此字段您将能够正确地聚合数据,而且您还可以使用识别码来不扫描所有集合(就像您正在使用$sort -1所做的那样,但只对比current date -24 hours大的部分进行$match )。

我希望这能帮上忙,即使没有密码。如果没有人能回答这个问题,我明天就试着玩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19783369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档