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

问题描述 投票:0回答:1

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

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

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

c# mongodb mongodb-.net-driver
1个回答
0
投票

唯一的方法是在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

然后您可以使用以下扩展名在查询中调用explain:

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();

简单得多。

© www.soinside.com 2019 - 2024. All rights reserved.