2015-08-17 45 views
11

Mam wiele złożonych zapytań, które czasami chciałbym sprawdzić bezpośrednio przed Mongo dla celów debugowania \ explaining(). W nowszym 2.0 + C# kierowcy, nie jestem pewien, jak to zrobić. W poprzedniej wersji działało coś o nazwie IMongoQuery i This.Przetłumacz FilterDefinition <TDocument> na regularne zapytanie json mongo, które można uruchomić w powłoce Mongo.

Prosty przykład:

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

Odpowiedz

11

Jeśli używasz najnowszej wersji sterownika, który jest 2.0.1 można łatwo umieścić ten filtr w operacji Find, wracaj jak IFindFluent i wydrukować jego ToString:

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

na przykład dla mnie to drukuje:

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

Dziękuję: -] –

9

Jesteś w stanie wykonać to za pomocą właściwości kolekcji za:

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

To wydaje się bardzo dziwne. Dlaczego potrzebuję kolekcji do konwersji FilterDefinition na ciąg json? Widzę, że to działa, po prostu nie ma w tym sposobu, w jaki powinno się to udać. – zrbecker

24

starałem się rozwiązać ten sam problem dzisiaj. Oto co znalazłem.

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

Nie miałem dostępu do kolekcji, kiedy ją nazywałem, więc nie mogłem skorzystać z powyższych rozwiązań.

Pozwala to zrobić

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

Myślę, że to dobre rozwiązanie, Danikar –

+1

Świetny fragment kodu - dobrze pomazany. – MoonKnight

+0

Czy ktoś wie, jak można to zrobić z IAggregateFluent ? – eatinasandwich