我想知道是否有人可以帮助我获得正确的聚合功能。我正在尝试计算在指定日期每小时显示一段文本的次数。到目前为止我已经:
db.daily_data.aggregate(
[
{ $project : { useragent: 1, datetime: 1, url: 1, hour: {$hour: new Date("$datetime")} } },
{ $match : { datetime: {$gte: 1361318400000, $lt: 1361404800000}, useragent: /.*LinkCheck by Siteimprove.*/i } },
{ $group : { _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: 1} } }
]
);
但我显然错了,因为小时总是0:
{
"result" : [
{
"_id" : {
"useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com",
"hour" : 0
},
"queriesPerUseragent" : 94215
}
],
"ok" : 1
}
以下是记录的缩减示例:
{
"_id" : ObjectId("50fe63c70266a712e8663725"),
"useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com",
"datetime" : NumberLong("1358848954813"),
"url" : "http://www.somewhere.com"
}
我也尝试使用new Date("$datetime").getHours()
代替$hour
函数尝试获得相同的结果,但没有运气。有人能指出我出错的方向吗?
谢谢!
答案 0 :(得分:3)
这是一个推荐,而不是您问题的答案。
在MongoDB上进行分析时,建议您为要计算的每个指标预先汇总您的存储桶(用例中的每小时存储桶)。
因此,对于您的指标,您可以更新预先聚合的集合(加快查询时间):
db.user_agent_hourly.update({url: "your_url", useragent: "your user agent", hour: current_HOUR_of_DAY, date: current_DAY_Date}, {$inc: {counter:1}}, {upsert:true})
考虑到在current_DAY_Date
中你必须指向当天的稳定日期值,即current_year / current_month / current_day 00:00:00,使用相同的小时:分钟:秒到每个指标在当天收到。
然后,您可以查询此集合,在任何给定的时间段内提取聚合分析,如下所示:
db.user_agent_hourly.aggregate(
{$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE}}},
{$group:{ _id : { useragent: "$useragent", hour: "$hour" } ,queriesPerUseragent: {$sum: "$count"} } },
{$sort:{queriesPerUseragent:-1}}
)
如果要使用特定用户代理筛选结果,可以使用下一个查询:
db.user_agent_hourly.aggregate(
{$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE, useragent: "your_user_agent"}}},
{$group:{ _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: "$count"} } }
)
PS:我们将每个收到的指标存储在其他集合中,以便在发生灾难或其他需求时对其进行重新处理。