【问题标题】:MongoDB Aggregation pipeline pythonMongoDB聚合管道python
【发布时间】:2019-08-02 17:32:31
【问题描述】:

我有一组日志文件,我需要找出系统在给定日期范围内显示“连接时超出平均限制...”消息的次数,并显示所有系统的结果给定日期范围以降序排列

目前我在 mongodb 集合中的文档看起来像

{'computerName':'APOOUTRDFG', 'datetime': 11/27/2019 10:45:23.123 'message': 'Average limit ....' } 因此,我尝试通过首先匹配消息字符串然后按计算机名称对它们进行分组来过滤我的结果,但这无济于事

db.collection.aggregate([
{ "$match": {
   'message': re.compile(r".*Average limit.*")
},
{ "$group": {
    "_id": { "$toLower": "$computerName" },
    "count": { "$sum": 1 }
} }    

])

预期结果

Date : 01-01-2012 to 31-01-2012

Computer Name Number of Average limit exceeded
computername1 120
computername2 83
computername3 34

【问题讨论】:

    标签: python-3.x mongodb pymongo


    【解决方案1】:

    假设您在 DB 中有以下数据:

    [
      {
        "computerName": "APOOUTRDFG",
        "datetime": "11/27/2019 10:45:23.123",
        "message": "Average limit ...."
      },
      {
        "computerName": "BPOOUTRDFG",
        "datetime": "01/02/2012 10:45:23.123",
        "message": "Average limit ...."
      },
      {
        "computerName": "CPOOUTRDFG",
        "datetime": "01/30/2012 10:45:23.123",
        "message": "Average limit ...."
      },
      {
        "computerName": "DPOOUTRDFG",
        "datetime": "01/30/2012 10:45:23.123",
        "message": "Some other message ...."
      }
    ]
    

    注意:'datetime' 格式为 %m/%d/%Y %H:%M:%S.%L,输入日期范围格式为:%d-%m-%Y

    以下查询可以获得预期的输出:

    db.collection.aggregate([
        {
            $match:{
                "message": /.*Average limit.*/i,
                $expr:{
                    $and:[
                        {
                            $gte:[
                                {
                                    $dateFromString:{
                                        "dateString":"$datetime",
                                        "format":"%m/%d/%Y %H:%M:%S.%L"
                                    }
                                },
                                {
                                    $dateFromString:{
                                        "dateString":"01-01-2012",
                                        "format":"%d-%m-%Y"
                                    }
                                }
                            ]
                        },
                        {
                            $lte:[
                                {
                                    $dateFromString:{
                                        "dateString":"$datetime",
                                        "format":"%m/%d/%Y %H:%M:%S.%L"
                                    }
                                },
                                {
                                    $dateFromString:{
                                        "dateString":"31-01-2012",
                                        "format":"%d-%m-%Y"
                                    }
                                }
                            ]
                        }
                    ]
                }
            }
        },
        {
            $group:{
                "_id":{
                    $toLower:"$computerName"
                },
                "count":{
                    $sum:1
                }
            }
        }
    ]).pretty()
    

    推荐:最好将日期保存为 ISODate 或数据库中的时间戳。

    【讨论】:

    • 请注意这里的正则表达式不区分大小写。
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2020-09-20
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2018-07-07
    相关资源
    最近更新 更多