Подтвердить что ты не робот

Перевести FilterDefinition <TDocument> на обычный запрос json mongo, который я могу запустить в оболочке mongo

У меня есть много сложных запросов, которые я иногда хочу проверить непосредственно против Mongo для целей отладки \explaining(). С новым драйвером С# 2.0 + я не уверен, как это сделать. С предыдущей версией работала вещь под названием IMongoQuery и This.

Простой пример:

FilterDefinition<LalalaEvent> filter = Builders<LalalaEvent>.Filter
    .Where(e => ids.Contains(e.Id) && e.Deleted != true );
4b9b3361

Ответ 1

Если вы используете последнюю версию драйвера, то есть 2.0.1, вы можете легко поместить этот фильтр в операцию Find, верните IFindFluent и распечатайте его ToString:

var filter = Builders<LalalaEvent>.Filter.Where(e => ids.Contains(e.Id) && e.Deleted != true);
var findFluent = collection.Find(filter);
Console.WriteLine(findFluent);

Например, для меня это печатает:

find({ "_id" : { "$in" : [1, 2, 3] }, "Deleted" : { "$ne" : true } })

Ответ 2

Я пытался решить ту же проблему сегодня. Вот что я нашел.

public static class MongoExtensions
{
    public static BsonDocument RenderToBsonDocument<T>(this FilterDefinition<T> filter)
    {
        var serializerRegistry = BsonSerializer.SerializerRegistry;
        var documentSerializer = serializerRegistry.GetSerializer<T>();
        return filter.Render(documentSerializer, serializerRegistry);
    }
}

У меня не было доступа к коллекции, когда я ее вызывал, поэтому я не мог использовать вышеупомянутые решения.

Это позволяет вам делать

var json = filter.RenderToBsonDocument().ToJson();

Ответ 3

Вы можете выполнить это с использованием свойств коллекции:

var result = filter.Render(collection.DocumentSerializer,
                           collection.Settings.SerializerRegistry).ToString();