2012-11-06 3 views
9

Gibt es eine Möglichkeit, .explain() oder Äquivalent auf Linq Abfragen auszuführen? Ich würdeGibt es eine "Explain Query" für MongoDB Linq?

  • Der Text der aktuellen JSON Abfrage
  • Die Ausgabe von .explain() (Indizes verwendet, usw.)
  • Es wäre auch schön sein, um die Ausführungszeit der Abfrage haben
wissen wollen

Antwort

10

Sie können die Json leicht genug bekommen, wenn Sie einen Query Wrapper haben;

Es gibt auch eine Explain() Methode auf MongoCursor, so dass Sie dies tun könnten;

var exp = Collection.FindAs<T>(qLinq).Explain() 
Console.WriteLine(exp.ToJson()); 

Also wenn Sie die Zeit brauchen, ist "Millis" drin;

var msTaken = exp.First(x => x.Name == "millis").Value.AsInt32; 

Wenn Sie eine IQueryable haben, versuchen Sie so etwas wie dieses;

void Do(MongoCollection col, IQueryable iq) 
{ 
     // Json Mongo Query 
     var imq = (iq as MongoQueryable<Blob>).GetMongoQuery(); 
     Console.WriteLine(imq.ToString()); 

     // you could also just do; 
     // var cursor = col.FindAs(typeof(Blob), imq); 
     var cursor = MongoCursor.Create(typeof(Blob), col, imq, ReadPreference.Nearest); 
     var explainDoc = cursor.Explain(); 

     Console.WriteLine(explainDoc); 
    }//Do() 
+0

Dank. Die meisten unserer Abfragen stammen von 'IQueryable'-Objekten. Vielleicht ist die bessere Frage, wie man aus einem "IQueryable" eine "IMongoQuery" macht? – kelloti

+0

Das ist nicht so einfach in diese Richtung zu gehen, aber Sie können es tun - siehe aktualisierte Antwort. Der andere Ansatz besteht darin, ein Repository über die Mongo Linq-Ebene zu legen, so dass Sie direkt mit Query <> -Objekten arbeiten können, Ihre Protokollierung dann IQueryable zurückgeben und IQueryable nicht in Query <> – cirrus

+0

konvertieren, danke für die Hilfe. Ihre Lösung wird jedoch nicht tatsächlich kompiliert. Sehen Sie meine Updates für das, was tatsächlich für mich funktioniert (beachten Sie, wie ich tief in den Ausdruck einrasten muss, um die "where" -Klausel zu erhalten). – kelloti

5

Wenn Sie diese Funktion in einer Bibliothek wollen, habe ich nur ein GitHub Projekt

Titel

MongoDB Abfrage Helfer für .NET

https://github.com/mikeckennedy/mongodb-query-helper-for-dotnet

Sie wird:

  • Erklären Sie einen LINQ Quer y als stark typisierte Objekt (macht es einen Index zum Beispiel verwenden)
  • Konvertieren einer LINQ-Abfrage an dem JavaScript-Code läuft in MongoDB

Check it out und dazu beitragen, wenn Sie es interessant finden.

2

Ja, da ist. Es zeigt alles .explain tut und hat eine boolean für Ausführlichkeit (es enthält die Zeit ausführen nahm zu):

var database = new MongoClient().GetServer().GetDatabase("db"); 
var collection = database.GetCollection<Hamster>("Hamsters"); 

var explanation = collection.AsQueryable().Where(hamster => hamster.Name == "bar").Explain(true); 
Console.WriteLine(explanation); 

es nicht, obwohl die Abfrage nicht zeigen. Hier ist eine Erweiterung Methode dafür:

public static string GetMongoQuery<TItem>(this IQueryable<TItem> query) 
{ 
    var mongoQuery = query as MongoQueryable<TItem>; 
    return mongoQuery == null ? null : mongoQuery.GetMongoQuery().ToString(); 
} 

Verbrauch:

var query = collection.AsQueryable().Where(hamster => hamster.Name == "bar").GetMongoQuery(); 
Console.WriteLine(query); 
1

In mongodb 3 C# ich folgende verwendet:

var users = Mongo.db.GetCollection<User>("Users"); 
var r = users(m => m._id == yourIdHere) 
    .Project(m => new { m._id, m.UserName, m.FirstName, m.LastName }) 
    .Limit(1); 

Console.WriteLine(users.ToString()); 

Ergebnis:

find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1)