你如何从Mongo约会领域获得DayHours?

时间:2013-11-05 06:53:49

标签: mongodb mongodb-query

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

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

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

2 个答案:

答案 0 :(得分: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}
    }}
)

答案 1 :(得分:0)

这也不是答案本身(我现在没有mongodb想出答案),但我认为你不能只用聚合框架做这个(我可能错了,所以我会解释自己)。

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

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

如果这是您经常要做的查询,我建议您在文档中实际添加date字段,因为使用此字段可以正确汇总数据,并且您也可以使用不扫描你的所有收藏品(就像你使用$ sort -1一样,但$match只扫描比current date - 24 hours更大的部分。

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