做到这一点的唯一方法是破解 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();
这要简单得多。