Вы можете просмотреть Collection.Find(...).ToString()
в окне Watch в Visual Studio, чтобы увидеть сгенерированный запрос, но это не работает для Collection.FindAsync(...)
.
Как я могу увидеть сгенерированный запрос, используемый за кулисами при вызове FindAsync()
?
Вы можете следовать этому документу, чтобы зарегистрировать процесс mongodriver. https://www.mongodb.com/docs/drivers/csharp/v2.25/fundamentals/logging/
Или, если вы хотите регистрировать только запрос, вы можете выполнить следующую настройку при создании клиента, чтобы видеть команды в консоли.
var client = new MongoClient(new MongoClientSettings()
{
Server = new MongoServerAddress("127.0.0.1"),
ClusterConfigurator = cb =>
{
cb.Subscribe<CommandStartedEvent>(e =>
{
Console.WriteLine($"{e.CommandName} - {e.Command.ToJson()}");
});
}
});
(Дубликат ): Смотрите мой ответ здесь. Итак, у вас есть следующие варианты:
Вы можете подписаться на события драйвера, в частности CommandStartedEvent
будет содержать информацию об отправленных командах на сервер.
var settings = MongoClientSettings.FromUrl(new MongoUrl(@"mongodb://localhost"));
settings.ClusterConfigurator = builder =>
{
builder.Subscribe<CommandStartedEvent>(x =>
{
var queryDocument = x.Command;
});
};
var client = new MongoClient(settings);
Также вы можете использовать плагин анализатора запросов для драйвера, который позволит вам видеть запросы, которые будут отправлены на сервер, прямо в заметках VS:
В качестве дополнительного подхода есть возможность использовать ILogger
impls, подробности можно найти здесь. Конфигурация будет выглядеть примерно так:
using var loggerFactory = LoggerFactory.Create(b =>
{
b.AddSimpleConsole();
b.SetMinimumLevel(LogLevel.Debug);
});
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.LoggingSettings = new LoggingSettings(loggerFactory);
var client = new MongoClient(settings);
но это не работает для Collection.FindAsync(...)
Find
(FluentAPI) и FindAsync
— это существенно разные методы (обратите внимание, что есть метод FindSync
), я не совсем уверен, можете ли вы положиться на то, что ToString
предоставил вам.
Я рекомендую визуализировать ваш фильтр, т.е. перевести ваш запрос без отправки запроса на сервер. Подробности смотрите в моем ответе здесь. Короче говоря, если у вас есть команда mongo (скажем, фильтр mongo или агрегатный конвейер), например:
var builder = Builders<Flower>.Filter;
var filter = builder.Lt(f => f.Price, 20) & builder.Eq(f => f.Category, "Perennial");
вы можете визуализировать его через:
var registry = BsonSerializer.SerializerRegistry;
var serializer = registry.GetSerializer<Flower>();
var output = filter.Render(serializer, registry).ToString();
output
будет содержать сгенерированный запрос, который драйвер отправит на сервер.
Спасибо! Вариант 4 работает хорошо и приводит к минимальному объему кода. Я просто использую этот лайнер, который можно просто вставить, а затем удалить, когда он мне не нужен:
var output = filter.Render(MongoDB.Bson.Serialization.BsonSerializer.SerializerRegistry.GetSerializer<TDocumentModel>(), MongoDB.Bson.Serialization.BsonSerializer.SerializerRegistry).ToString();