2015-08-17 6 views
11

Ich habe viele komplexe Abfragen, die ich manchmal direkt gegen Mongo zum Debuggen \ erklären() Zwecke überprüfen möchten. Mit dem neueren 2.0+ C# -Treiber bin ich nicht sicher, wie man das macht. Mit der Vorgängerversion wurde eine Sache namens IMongoQuery und This bearbeitet.Übersetzen FilterDefinition <TDocument> zu regelmäßigen JSON Mongo Abfrage, die ich in einem Mongo-Shell ausführen kann

Ein einfaches Beispiel:

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

Antwort

11

Wenn Sie die neueste Version des Treibers verwenden, das ist 2.0.1 Sie einfach diese Filter in einem Find Betrieb setzen kann, erhält ein IFindFluent zurück und druckt ihre ToString:

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

zum Beispiel für mich, diese Drucke:

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

Sie tun danken: -] –

9

Sie sind in der Lage zu führen, dass die Sammlung der Eigenschaften mit:

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

Diese sehr seltsam scheint. Warum sollte ich eine Sammlung zum Konvertieren einer FilterDefinition in eine JSON-Zeichenfolge benötigen? Ich sehe, es funktioniert, es fühlt sich einfach nicht so an, wie man es tun sollte. – zrbecker

24

Ich habe versucht, das gleiche Problem heute zu lösen. Hier ist was ich gefunden habe.

Ich hatte keinen Zugriff auf eine Sammlung, als ich anrief, also konnte ich die oben genannten Lösungen nicht verwenden.

Auf diese Weise können Sie

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

Ich denke, das ist eine gute Lösung, Danikar –

+1

Great Code-Snippet - gut geschlagen. – MoonKnight

+0

Weiß jemand, wie dies mit IAggregateFluent getan werden könnte? – eatinasandwich