将FilterDefinition <TDocument>转换为我可以在mongo shell中运行的常规json mongo查询

Shy*_*leg 17 .net c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

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

一个简单的例子:

FilterDefinition<LalalaEvent> filter = Builders<LalalaEvent>.Filter
    .Where(e => ids.Contains(e.Id) && e.Deleted != true );
Run Code Online (Sandbox Code Playgroud)

zrb*_*ker 33

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我打电话时无法访问集合,因此我无法使用上述解决方案.

这可以让你做到

var json = filter.RenderToBsonDocument().ToJson();
Run Code Online (Sandbox Code Playgroud)


i3a*_*non 18

如果您使用的是最新版本的驱动程序,即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);
Run Code Online (Sandbox Code Playgroud)

例如对我来说这打印:

find({ "_id" : { "$in" : [1, 2, 3] }, "Deleted" : { "$ne" : true } })
Run Code Online (Sandbox Code Playgroud)


Vla*_*dak 16

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

var result = filter.Render(collection.DocumentSerializer,
                           collection.Settings.SerializerRegistry).ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很奇怪.为什么我需要一个集合来将FilterDefinition转换为json字符串?我认为它有效,它只是感觉不应该像它应该去做的那样. (5认同)