多くの複雑なクエリがあり、それらをデバッグして\ explaining()の目的でMongoに対して直接チェックしたい場合があります。新しい2.0+ c#ドライバーでは、これを行う方法がわかりません。以前のバージョンでは、IMongoQuery
と呼ばれるものがあり、 This が機能していました。
簡単な例:
FilterDefinition<LalalaEvent> filter = Builders<LalalaEvent>.Filter
.Where(e => ids.Contains(e.Id) && e.Deleted != true );
ドライバーの最新バージョン(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 } })
_
今日も同じ問題を解決しようとしていました。これが私が見つけたものです。
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();
コレクションのプロパティを使用してそれを実行できます。
var result = filter.Render(collection.DocumentSerializer,
collection.Settings.SerializerRegistry).ToString();