我已经开始对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})
答案 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
}
}
])
您可以根据需要调整匹配/分组。