MongoDB中按小时分组的时间戳

MongoDB中按小时分组的时间戳,mongodb,pymongo,Mongodb,Pymongo,我在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

我在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
}
{
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_时间戳:u'Nov 20 15:09:55',
u'syslog_facility':u'user-level',
u'syslog\u严重性:u'notice',
u'host':u'2.4.6.8:2468',
u'syslog_程序:u'kernel',
u'syslog\u主机名“:u'server01”,
u‘收到时间’:u‘2014-11-20 20:09:55 UTC’,
u'message':u'Nov 20 15:09:55 server01内核:[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“u id”:ObjectId('546e4a93e98673fe8f11a4d2'),
u'type':u'syslog',
u'syslog\u严重性\u代码“:5,
系统日志设施代码:1
}
我用Flask用Python表示这些数据,结果很好,但所有的消息都一一显示在图表上。我想做几个月、几个星期、几个小时的水桶

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


问题:

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


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

您应该以一种与检索期间使用模式相匹配的方式构造模式——换句话说,在进入数据库的过程中进行数据聚合。对于每次插入,请使用$inc和$set,并按小时、天、周等更新所需的统计数据。

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

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

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

谢谢,我认为这会起作用,我的时间戳不是Mongo需要的格式,因此我无法确定。“无法从BSON类型字符串转换为日期”将日期存储为字符串是一个错误——例如,您不能进行范围搜索。这是一个常见的错误,但你需要改变这一点是的,听起来很棒。但我没有发现如何构建这样一个摄取转化。有很多例子,但不包括它们去哪里,如何查看它们,如何更改它们等等。你可能有一个指针吗?看看----它会给你一些想法。你想用谷歌搜索的关键词是“预聚合”,我把这个问题分开了,把两个主题结合起来是不明智的。我的另一半问题是: