Translate FilterDefinition<TDocument> to regular json mongo query that i can run in a mongo shell

拈花ヽ惹草 提交于 2019-11-27 13:01:13

问题


I have many complex queries that I sometimes wish to check directly against Mongo for debugging \ explaining() purposes. With the newer 2.0+ c# driver, i'm not sure how to do this. With the previous version there was a thing called IMongoQuery and This worked.

A simple example:

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

回答1:


If you're using the latest version of the driver, which is 2.0.1 you can easily put that filter in a Find operation, get back an IFindFluent and print its ToString:

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

For example for me this prints:

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



回答2:


I was trying to solve the same problem today. Here is what I found.

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

I didn't have access to a collection when I was calling it, so I couldn't use the above solutions.

This allows you to do

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



回答3:


You are able to perform that using the collection's properties:

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


来源:https://stackoverflow.com/questions/32047692/translate-filterdefinitiontdocument-to-regular-json-mongo-query-that-i-can-run

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!