使用 C# 驱动程序时分析 MongoDB 查询

发布于 2024-11-14 16:29:42 字数 97 浏览 3 评论 0原文

有没有办法记录 MongoDB C# 驱动程序生成并发送到 mongodb 的实际查询?与 SQL Server 一样,您可以使用 SQL Profiler 来显示所有传入的查询。

Is there a way to log the actual queries that are produced by the MongoDB C# driver and sent to the mongodb? Like in SQL Server, you have SQL Profiler that shows you all the incoming queries.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

江湖彼岸 2024-11-21 16:29:42

您可以启用分析并按照 @pingw33n 的建议在 mongodb 日志中查看实际查询。

或者您可以为集合创建扩展方法。在那里查找并记录数据:

public static class MongodbExtentions
{
    public static MongoCursor<T> FindAsAndLogQuery<T>(this MongoCollection<T> coll, 
                                                                    IMongoQuery query)
    {
        var queryString = query.ToJson();
        //log query here , insert into mongodb, etc ...
        return coll.FindAs<T>(query);
    }
}

You can enable profiling and see actual queries in mongodb log as @pingw33n suggested.

Or you can create extention method for collection.Find and log data there:

public static class MongodbExtentions
{
    public static MongoCursor<T> FindAsAndLogQuery<T>(this MongoCollection<T> coll, 
                                                                    IMongoQuery query)
    {
        var queryString = query.ToJson();
        //log query here , insert into mongodb, etc ...
        return coll.FindAs<T>(query);
    }
}
可遇━不可求 2024-11-21 16:29:42

@Andrew 建议的扩展方法仅适用于 FIND 查询。
从 MongoDB 3.2 开始,您可以执行如下操作,该操作适用于所有查询。

private static void LogQuery<TEntity>(string queryType, FilterDefinition<TEntity> filter,
            UpdateDefinition<TEntity> update, IMongoCollection<TEntity> collection)
            where TEntity : class, new()
        {
            var renderedFilter = filter.Render(collection.DocumentSerializer, collection.Settings.SerializerRegistry);
            var renderUpdate = update.Render(collection.DocumentSerializer, collection.Settings.SerializerRegistry);
            // Log you shell scrip as string to a file or DB
            Log.Debug(
                $"use {collection.Database.DatabaseNamespace.DatabaseName} db.{collection.CollectionNamespace.CollectionName}.{queryType}({renderedFilter.ToJson()},{renderUpdate.ToJson()})");
        }

Extension method @Andrew suggested would only work for FIND queries.
From MongoDB 3.2 you can do something like below which will work for all queries.

private static void LogQuery<TEntity>(string queryType, FilterDefinition<TEntity> filter,
            UpdateDefinition<TEntity> update, IMongoCollection<TEntity> collection)
            where TEntity : class, new()
        {
            var renderedFilter = filter.Render(collection.DocumentSerializer, collection.Settings.SerializerRegistry);
            var renderUpdate = update.Render(collection.DocumentSerializer, collection.Settings.SerializerRegistry);
            // Log you shell scrip as string to a file or DB
            Log.Debug(
                $"use {collection.Database.DatabaseNamespace.DatabaseName} db.{collection.CollectionNamespace.CollectionName}.{queryType}({renderedFilter.ToJson()},{renderUpdate.ToJson()})");
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文