翻译FilterDefinition< TDocument>常规json mongo查询,我可以在mongo shell

本文关键字:mongo 查询 shell 我可以 json FilterDefinition TDocument 常规 翻译 | 更新日期: 2023-09-27 18:08:11

我有许多复杂的查询,有时我希望直接对Mongo进行检查,以便调试' explain()。使用较新的2.0+ c#驱动程序,我不确定如何做到这一点。在之前的版本中,有一个叫做IMongoQuery的东西,这个工作。

一个简单的例子:

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

翻译FilterDefinition< TDocument>常规json mongo查询,我可以在mongo shell

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

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();

如果您使用的是最新版本的驱动程序,即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 } })

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

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