【问题标题】:Group timestamp by hour in MongoDB在 MongoDB 中按小时分组时间戳
【发布时间】:2014-11-25 11:01:32
【问题描述】:

我在 Mongo 中有很多 syslog 文档,下面是一个示例。我想做的是在图表中按天/小时/月对它们进行分组。该值将是特定时间段内的文档计数。

{
    u'syslog_message': u'[10724525.839722] [UFW BLOCK] IN=venet0 OUT= MAC= SRC=1.2.3.4 DST=9.8.7.6 LEN=52 TOS=0x08 PREC=0x20 TTL=50 ID=55384 PROTO=TCP SPT=349 DPT=123 WINDOW=14600 RES=0x00 SYN URGP=0 ',
    u'received_from': u'1.3.5.7:1234',
    u'@version': u'1',
    u'@timestamp': datetime.datetime(2014, 11, 20, 15, 9, 55),
    u'syslog_timestamp': u'Nov 20 15:09:55',
    u'syslog_facility': u'user-level',
    u'syslog_severity': u'notice',
    u'host': u'2.4.6.8:2468',
    u'syslog_program': u'kernel',
    u'syslog_hostname': u'server01',
    u'received_at': u'2014-11-20 20:09:55 UTC',
    u'message': u'<4>Nov 20 15:09:55 server01 kernel: [10724525.839722] [UFW BLOCK] IN=venet0 OUT= MAC= SRC=1.2.3.4 DST=2.3.4.5 LEN=52 TOS=0x08 PREC=0x20 TTL=50 ID=55384 PROTO=TCP SPT=1234 DPT=543 WINDOW=14600 RES=0x00 SYN URGP=0 ',
    u'_id': ObjectId('546e4a93e98673fe8f11a4d2'),
    u'type': u'syslog',
    u'syslog_severity_code': 5,
    u'syslog_facility_code': 1
}

我使用Chartkick 用 Flask 在 Python 中呈现这些数据,结果很好,但所有消息都在图表上一一显示。我想制作几个月、几周、几个小时等的水桶。

为此,我可以使用键“@timestamp”中的值。这工作正常,但在 Python 中按计数分组意味着首先检索所有文档,这不可能是正确的:D


问题:

什么是我可以在 Pymongo 中使用来获取 count_by_week 等的正确查询,或者我应该在服务器上使用聚合之类的东西,这会是什么样子?

四台服务器,请注意上面的平线,因为缺少计时分组。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    您要么想按照@alernerdev 的建议在插入时更新计数,要么想在服务器上进行聚合。我不熟悉 Pymongo,但它看起来使用的语法与我使用过的 MongoDB 的 JavaScript 驱动程序非常相似。因此,要作为服务器端 aggregation 执行此操作,您可以执行以下操作:

    db.logs.aggregate([
            {"$group": {"_id": {"week": {"$week": "$@timestamp"}, "year": {"$year": "$@timestamp"}}, "count": {"$sum": 1}}}
        ])
    

    这将按年份和每周对日志条目进行分组,并计算每组中的文档数。

    【讨论】:

    • 谢谢,我认为这行得通,我的时间戳不是 Mongo 需要的格式,所以我无法确定。 “无法从 BSON 类型字符串转换为日期”
    • 将日期存储为字符串是错误的——例如,您不能进行范围搜索。这是一个常见的错误,但你需要改变它
    【解决方案2】:

    您应该以一种与您在检索过程中使用它的方式相匹配的方式来构建您的架构——换句话说,在进入数据库的过程中进行数据聚合。对于每次插入,使用 $inc 和 $set 并按小时、天、周等更新您需要的任何统计信息。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2014-07-08
    • 2015-12-24
    • 2018-09-04
    • 2011-10-13
    • 2014-05-31
    相关资源
    最近更新 更多