从C#驱动程序向本地托管的Mongodb服务器触发查询

时间:2018-11-20 12:30:36

标签: c# mongodb

我正在使用C#mongodb驱动程序2.4.4。 我想查看我的C#代码对mongodb服务器进行的查询或请求。

有没有一种方法可以检查在特定时间范围内对mongo db服务器的所有请求?有什么办法可以捕获对mongodb的请求?

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是,如果您进入mongo控制台并使用参数setProfilingLevel(全部)调用2设置,则对数据库启用概要分析。

> db.setProfilingLevel(2, 0)
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }

在C#中,当您使用唯一的MongoClientMongoClientSettings对象中创建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()