如何在当前 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();
简单多了。
我刚开始使用 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();
简单多了。