如何在 Mongo Server 4.0 上的 C# 驱动程序 2.7.0 中执行 db.collection.explain()?

Posted

技术标签:

【中文标题】如何在 Mongo Server 4.0 上的 C# 驱动程序 2.7.0 中执行 db.collection.explain()?【英文标题】:How do you perform db.collection.explain() in C# driver 2.7.0 on Mongo Server 4.0? 【发布时间】:2018-09-06 12:33:25 【问题描述】:

答案MongoDB - can't use .explain() to get query info in C# code? 或Is there an "Explain Query" for MongoDB Linq? 已过时,并且在最新版本的 C# 驱动程序中不再存在类和方法。

【问题讨论】:

我也在尝试寻找与 Explain() 和提示等效的东西,但在 C# 中找不到任何关于此的内容。这有什么更新吗? @shanti 是的,我最终能够克服它!在下面查看我的答案。如果您需要使用连接(查找)测试查询的性能,则该过程会涉及更多。 【参考方案1】:

作为一种解决方法,我能够使用带有选项重载的查找语法来对我想要调整的查询运行解释。

    [Fact]
    public async Task Metrics()
    
        var options = new FindOptions
        
            Modifiers = new BsonDocument("$explain", true)
        ;
        var queryable = await MongoDb.Collection.Find(" Paid: false", options).As<StatsBsonDocument>().ToListAsync(); // StatsBsonDocument BsonDocument  
        //Console.WriteLine(queryable.First());
        queryable.First().GetStats();            
    



public class StatsBsonDocument

    public dynamic queryPlanner  get; set; 
    public ExecutionStats executionStats  get; set; 
    public dynamic serverInfo  get; set; 

    public void GetStats()
    
        try
        
            Console.WriteLine($"queryPlanner.winningPlan.inputStage.stage");
        
        catch (Exception e)
        
            Console.WriteLine($"executionSuccess executionStats.executionSuccess, stage queryPlanner.winningPlan.stage,");
        
        Console.WriteLine($"executionStats.nReturned returned documents, executionStats.executionTimeMillisms execution");
        Console.WriteLine($"executionStats.totalKeysExamined keys examined , executionStats.totalDocsExamined documents examined");
        Console.WriteLine($"index vs returned (decimal)executionStats.totalKeysExamined / executionStats.nReturned, " +
        $"scanned documents/returned (decimal)executionStats.totalDocsExamined / executionStats.nReturned");
        Console.WriteLine();

        // AND_SORTED stage or an AND_HASH stage. index intersection
    


public class QueryPlanner

    public dynamic plannerVersion;
    public string Namespace;
    public dynamic indexFilterSet;
    public dynamic parsedQuery;
    public dynamic winningPlan;
    public dynamic rejectedPlans;


public class ExecutionStats

    public bool executionSuccess;
    public int nReturned;
    public int executionTimeMillis;
    public int totalKeysExamined;
    public int totalDocsExamined;
    public dynamic executionStages;
    public dynamic allPlansExecution;

【讨论】:

感谢@Kdog,我会尝试在 FindOptions 中添加 $explain 并在此处更新... 如果我只是在 FindOptions 中添加修饰符,它就可以工作。但是由于我的索引不区分大小写并且使用排序规则,所以我使用这个 query = collection.Find(filter, options: new FindOptions Collat​​ion = request.SearchCollat​​ion, Modifiers = new BsonDocument("$explain", true) )。 SortByDescending(x => x._Id).Limit(request.Limit); var explain = query.Project(new BsonDocument()).FirstOrDefault()?.ToJson();它给出了一个例外,即 OP_QUERY 不支持排序规则。

以上是关于如何在 Mongo Server 4.0 上的 C# 驱动程序 2.7.0 中执行 db.collection.explain()?的主要内容,如果未能解决你的问题,请参考以下文章

window server 2012上安装mongo4.0

如何从 Parse Server 在 Mongo 数据库上设置次要首选读取?

Windows 上的本地 Mongo - 无法连接到服务器 127.0.0.1:27017,连接尝试失败

在 Windows Server 2012 上的 .NET 4.0 上运行服务构建时出现 System.Configuration.ConfigurationException

mongo 4.0以下版本 类型转换

Deploy A MongoDB 4.0 Sharded Cluster