你如何从 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 顺序的记录