23

我有很多复杂的查询,有时我希望直接针对 Mongo 进行检查以进行调试 \解释() 目的。使用较新的 2.0+ c# 驱动程序,我不知道该怎么做。在以前的版本中,有一个东西叫做IMongoQuery并且有效。

一个简单的例子:

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

3 回答 3

44

我今天试图解决同样的问题。这是我发现的。

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();
于 2015-08-21T17:37:10.810 回答
25

如果您使用的是最新版本的驱动程序,即 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 } })
于 2015-08-17T10:18:36.773 回答
20

您可以使用集合的属性来执行此操作:

var result = filter.Render(collection.DocumentSerializer,
                           collection.Settings.SerializerRegistry).ToString();
于 2015-08-20T12:43:39.997 回答