web-dev-qa-db-ja.com

FilterDefinition <TDocument>を、mongoシェルで実行できる通常のjson mongoクエリに変換します。

多くの複雑なクエリがあり、それらをデバッグして\ explaining()の目的でMongoに対して直接チェックしたい場合があります。新しい2.0+ c#ドライバーでは、これを行う方法がわかりません。以前のバージョンでは、IMongoQueryと呼ばれるものがあり、 This が機能していました。

簡単な例:

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

ドライバーの最新バージョン(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 } })
_
18
i3arnon

今日も同じ問題を解決しようとしていました。これが私が見つけたものです。

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

コレクションのプロパティを使用してそれを実行できます。

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