我正在使用C#mongodb驱动程序2.4.4。 我想查看我的C#代码对mongodb服务器进行的查询或请求。
有没有一种方法可以检查在特定时间范围内对mongo db服务器的所有请求?有什么办法可以捕获对mongodb的请求?
答案 0 :(得分:0)
执行此操作的最佳方法是,如果您进入mongo控制台并使用参数setProfilingLevel
(全部)调用2
设置,则对数据库启用概要分析。
> db.setProfilingLevel(2, 0)
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
在C#中,当您使用唯一的MongoClient
在MongoClientSettings
对象中创建ApplicationName
对象时,在C#中进行下一步。这样我们就可以稍后过滤结果。
var client = new MongoClient(new MongoClientSettings()
{
ApplicationName = "Sackoverflow-Question-53393041"
});
var database = client.GetDatabase("test");
var collection = database.GetCollection<BsonDocument>("test");
collection.InsertOne(new BsonDocument()
{
{"_id", 1 }
});
现在,当我们的应用程序对mongodb运行任何操作时,将对其进行概要分析。要查看我们的应用程序在mongodb上运行的内容,我们可以在mongo控制台中运行以下查询:
> db.system.profile.find({"appName": "Sackoverflow-Question-53393041"}).pretty()
请注意,我们使用在C#代码中设置的
appName
进行查询,这使我们可以缩小查询范围。您还可以查询配置文件的任何其他部分,例如命令(插入,查询等)。
通过上面的查询,以下内容将输出到控制台。
{
"op" : "insert",
"ns" : "test.test",
"command" : {
"insert" : "test",
"ordered" : true,
"$db" : "test",
"lsid" : {
"id" : UUID("4727f842-a50c-488d-a18a-f9830cac018d")
}
},
"ninserted" : 1,
"keysInserted" : 1,
"numYield" : 0,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(5),
"w" : NumberLong(3)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(1),
"w" : NumberLong(2),
"W" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(1),
"w" : NumberLong(2)
}
}
},
"responseLength" : 29,
"protocol" : "op_msg",
"millis" : 21,
"ts" : ISODate("2018-12-01T15:33:42.526Z"),
"client" : "127.0.0.1",
"appName" : "Sackoverflow-Question-53393041",
"allUsers" : [ ],
"user" : ""
}
这也适用于查询,因此,如果我们在C#中执行以下代码
var result = collection.Find(x => x["_id"] == 1);
我们将获得以下个人资料文件
{
"op" : "query",
"ns" : "test.test",
"command" : {
"find" : "test",
"filter" : {
"_id" : 1
},
"$db" : "test"
},
"keysExamined" : 1,
"docsExamined" : 1,
"cursorExhausted" : true,
"numYield" : 0,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(2)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(1)
}
}
},
"nreturned" : 1,
"responseLength" : 99,
"protocol" : "op_msg",
"millis" : 1,
"planSummary" : "IDHACK",
"execStats" : {
"stage" : "IDHACK",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keysExamined" : 1,
"docsExamined" : 1
},
"ts" : ISODate("2018-12-01T15:35:31.150Z"),
"client" : "127.0.0.1",
"appName" : "Sackoverflow-Question-53393041",
"allUsers" : [ ],
"user" : ""
}
如您所说,您需要在给定的日期范围内使用它,以便可以通过以下查询查询"ts"
字段
> db.system.profile.find( { "appName" : "Sackoverflow-Question-53393041", $and : [ { "ts" : { $gt : ISODate("2018-12-01") } }, { "ts" : { $lt : ISODate("2018-12-02") } } ] } ).pretty()