我正在尝试使用mongo聚合函数对DayHours进行分组,以获取过去24小时的数据。 例如:如果事件的时间是星期五的6:00,那么“DayHour”将是6-5。 我可以轻松地按小时分组以下查询:
db.api_log.aggregate([
{ '$group': {
'_id': {
'$hour': '$time'
},
'count': {
'$sum':1
}
}
},
{ '$sort' : { '_id': -1 } }
])
我觉得有更好的方法可以做到这一点。我在$ project语句中尝试连接,但是你只能在mongo中连接字符串(显然)。 我实际上只需要按天和小时结束分组,但它会完成。谢谢。
答案 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
更大的部分。
我希望即使没有代码也可以提供帮助。如果没有人能够回答这个问题,我明天会尝试使用它。