【问题标题】:How do I perform explain in current mongodb c# driver version?如何在当前的 mongodb c# 驱动程序版本中执行解释?
【发布时间】:2020-03-12 14:58:13
【问题描述】:

我刚开始使用 MongoDb 驱动程序,我在 Stackoverflow 上发现了多个帖子,说只需将 .Explain() 添加到您的 IQueryable 即可。问题是,我的 IDE 不建议使用这种方法。

我已经开始挖掘,我在 MongoDb 驱动程序的 master 分支中看到,Explain 扩展方法在 LinqExtensionMethods 类中,它本身在 MongoDB.Driver.Legacy 中,当前驱动程序没有引用它?

那么当前驱动的方法是什么?

【问题讨论】:

  • 在新的核心驱动中是ExplainOperation。出于好奇,你期待什么魔法?
  • 可能魔法这个词太强了,我只希望执行计划,仅此而已。知道如何将 ExplainOperation 与 Linq API 一起使用,可能是示例或文章?

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

做到这一点的唯一方法是破解 MongoDB 驱动程序中的所有内部或私有内容,我不建议您这样做,但是,可以使用以下代码。

var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<Event>("events");

var filter = Builders<Event>.Filter.Gte(x => x.At, DateTime.UtcNow);
var fields = Builders<Event>.Projection.Include(x => x.Name);

var settingsSerializerRegistry = collection.Settings.SerializerRegistry;
var bsonSerializer = settingsSerializerRegistry.GetSerializer<Event>();
var command = new BsonDocument
{
    { "find", collection.CollectionNamespace.CollectionName },
    { "filter", filter.Render(bsonSerializer, settingsSerializerRegistry)},
    { "projection", fields.Render(bsonSerializer, settingsSerializerRegistry) },
    { "skip", 5 },
    { "limit", 10 },
};

var subject = new ExplainOperation(database.DatabaseNamespace, command, new MessageEncoderSettings())
{
    Verbosity = ExplainVerbosity.QueryPlanner
};
var readPreferenceBinding = new ReadPreferenceBinding(client.Cluster, ReadPreference.Primary, NoCoreSession.NewHandle());

var explain = subject.Execute(readPreferenceBinding, CancellationToken.None);
//{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.events", "indexFilterSet" : false, "parsedQuery" : { "At" : { "$gte" : ISODate("2020-03-14T23:45:37.143Z") } }, "winningPlan" : { "stage" : "EOF" }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "DESKTOP-ULTR09L", "port" : 27017, "version" : "4.2.3", "gitVersion" : "6874650b362138df74be53d366bbefc321ea32d4" }, "ok" : 1.0 }

但是,解释扩展在 MongoDB.Driver.Legacy 包中,任何可以运行 .NETStandard 1.5 和 .NETFramework 4.5.2 的东西仍然支持这一点

所以这对你来说可能是一条更好的路线! ?

你可以从包管理器安装它

Install-Package mongocsharpdriver

然后您可以使用以下扩展来对查询调用说明:

var client = new MongoClient();

var database = client.GetDatabase("test");
var collection = database.GetCollection<Event>("events");
var explain = collection.AsQueryable()
    .Where(c => c.At >= DateTime.UtcNow.AddDays(-1) && c.At < DateTime.UtcNow)
    .Take(1)
    .Explain();

这要简单得多。

【讨论】:

  • 谢谢,任何想法为什么他们在当前版本中从 LINQ 中删除了它,他们是否打算将它带回来?还是一般的 mongodb 的 c# 社区认为 LINQ 实现不是很成功,在生产中使用的不多?
  • 根据经验,LINQ 实现被大量使用(并且也编写了高效的查询),但是,在优化查询时,我在 MongoDB 中启用了分析,而不是尝试从实际应用程序中进行分析。 docs.mongodb.com/manual/reference/method/db.setProfilingLevel
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2013-02-08
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2017-07-12
  • 1970-01-01
相关资源
最近更新 更多