Как я могу увидеть сгенерированный запрос при вызове Collection.FindAsync()?

Вы можете просмотреть Collection.Find(...).ToString() в окне Watch в Visual Studio, чтобы увидеть сгенерированный запрос, но это не работает для Collection.FindAsync(...).

Как я могу увидеть сгенерированный запрос, используемый за кулисами при вызове FindAsync()?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете следовать этому документу, чтобы зарегистрировать процесс 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()}");
        });
    }
});
Ответ принят как подходящий

(Дубликат ): Смотрите мой ответ здесь. Итак, у вас есть следующие варианты:

  1. Вы можете подписаться на события драйвера, в частности 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);
    
  2. Также вы можете использовать плагин анализатора запросов для драйвера, который позволит вам видеть запросы, которые будут отправлены на сервер, прямо в заметках VS:

  3. В качестве дополнительного подхода есть возможность использовать 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.Seri‌​alizerRegistry.GetSe‌​rializer<TDocumentMo‌​del>(), MongoDB.Bson.Serialization.BsonSerializer.SerializerRegistry‌​).ToString();

David Klempfner 01.05.2024 00:52

Другие вопросы по теме