我试图在mongo聚合函数中按DayHours进行分组,以获取过去24小时的数据。例如:如果事件发生的时间是周五6:00,那么"DayHour“将是6-5。我可以很容易地使用以下查询按小时分组:
db.api_log.aggregate([
{ '$group': {
'_id': {
'$hour': '$time'
},
'count': {
'$sum':1
}
}
},
{ '$sort' : { '_id': -1 } }
])
我觉得有更好的方法可以做到这一点。我已经尝试过在$project语句中连接,但是您只能在mongo中连接字符串(显然)。实际上,我只需要在一天一小时内分组,不管它是怎么做的。谢谢。
发布于 2013-11-05 08:09:59
我假设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}
}}
)
发布于 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
)。
我希望这能帮上忙,即使没有密码。如果没有人能回答这个问题,我明天就试着玩。
https://stackoverflow.com/questions/19783369
复制相似问题