mongodb - 聚合 : Counting Items Per Hour

标签 mongodb aggregation-framework

我想知道是否有人可以帮助我正确设置聚合函数。我正在尝试计算一段文本在指定日期每小时出现的次数。到目前为止,我有:

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 函数来尝试获得相同的结果,但是没有运气。有人可以指出我出错的方向吗?

谢谢!

最佳答案

这是对您的问题的建议,而不是答案。

在用于分析的 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 ,使用相同的 hour:minute:second当天收到的每个指标。

然后,您可以查询此集合,提取任何给定时间段的聚合分析,如下所示:

 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:我们将收到的每一个指标都存储在其他集合中,以便在发生灾难或其他需要时能够对其进行重新处理。

关于mongodb - 聚合 : Counting Items Per Hour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15021809/

相关文章:

mongodb - 使用 MongoDB 中的聚合值更新多个文档

java - 返回唯一的mongo文档

arrays - 如何使用 MongoDB 将对象 $addToSet 设置为数组并 $sort ?

mongodb - Redis:设置时间=获取时间。为什么?

javascript - 确定用户嵌入文档数组中是否存在值

java - Spring Data MongoDB 聚合与日期匹配

mongodb - 何时在 mongodb 中使用 $and 查询

javascript - concat 不被 mongodb 识别

node.js - 过滤数组时如何包含空数组

mongodb - 查询以检索 mongodb 数组中的多个对象