MongoDB查询不同的字段,无论值(慢查询分析)

时间:2016-07-11 09:33:17

标签: mongodb

我已经开始对MongoDB上的慢查询进行分析,经过几天我有大量数据。我想要做的是通过以下方式获取分析记录:命名空间(集合名称)和用于过滤的字段。

有没有办法编写查询以根据字段名称(而不是值)获取不同的记录?

{
    "op" : "query",
    "ns" : "myLovelyDb.Stuff",
    "query" : {
        "find" : "Stuff",
        "filter" : {
            "StartTime" : {
                "$lt" : ISODate("2016-07-04T16:01:31.000Z")
            },
            "EndTime" : {
                "$gt" : ISODate("2016-07-04T16:01:31.000Z")
            }
        }
        ...
    }
},
{
    "op" : "query",
    "ns" : "myLovelyDb.Stuff",
    "query" : {
        "find" : "Stuff",
        "filter" : {
            "StartTime" : {
                "$lt" : ISODate("1999-07-04T16:01:31.000Z")
            },
            "EndTime" : {
                "$gt" : ISODate("1999-07-04T16:01:31.000Z")
            }
        }
        ...
    }
},
{
    "op" : "query",
    "ns" : "myLovelyDb.Stuff",
    "query" : {
        "find" : "Stuff",
        "filter" : {
            "ParentId" : {
                "$ne" : 666
            }
        }
        ...
    }
}

...所以我从这个集合中只得到2条记录(这应该足以在列上添加索引)。

db.getCollection( 'system.profile')找到({OP: “查询”})排序({米利斯:-1})

1 个答案:

答案 0 :(得分:0)

过了一会儿,我发现我仍然可以使用聚合(https://docs.mongodb.com/manual/aggregation/),所以它来了:

db.system.profile.aggregate([
    {
        $match: {
            "millis": {
                "$gt": 300
            },
            "op": "query"
        }
    },
    {
        $group: {
            "_id": {
                "collection": "$query.find",
                "command": "$command",
                "op": "$op"
            },
            "avgTime": {
                $avg: "$millis"
            },
            "count": {
                $sum: 1
            },
            "execStats": {
                $first: "$execStats"
            },
            "query": {
                $first: "$query"
            }
        }
    },
    {
        $sort: {
            "avgTime": -1
        }
    }
])

您可以根据需要调整匹配/分组。