如何在当前 mongodb c# 驱动程序版本中执行解释?

How do I perform explain in current mongodb c# driver version?

我刚开始使用 MongoDb 驱动程序,我在 Whosebug 上发现了多篇文章,它们说只需将 .Explain() 添加到您的 IQueryable 中,它就会发挥作用。问题是,我的 IDE 不建议使用这种方法。

我已经开始挖掘,我在 MongoDb 驱动程序的主分支中看到,Explain 扩展方法在 LinqExtensionMethods class 中,它本身在 MongoDB.Driver.Legacy 中,而不是从当前驱动程序引用?

那么现在的驱动程序是什么方法呢?

做到这一点的唯一方法是绕过 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();

简单多了。