2012-11-06 12 views

Odpowiedz

10

Możesz łatwo uzyskać JSONA, jeśli masz opakowanie z zapytaniem;

var qLinq = Query<T>.Where(x => x.name=="jim"); 
Console.WriteLine(qLinq.ToJson()); 

Istnieje również metoda Explain() na MongoCursor, więc można to zrobić;

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

Więc jeśli chcesz mieć czas, to tam jest "millis";

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

Jeśli masz numer IQueryable, spróbuj czegoś takiego;

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

Dzięki. Większość naszych zapytań pochodzi z obiektów 'IQueryable'. Może lepszym pytaniem jest jak zmienić 'IQueryable' w' IMongoQuery'? – kelloti

+0

Nie jest łatwo przejść w tym kierunku, ale możesz to zrobić - patrz zaktualizowana odpowiedź. Drugie podejście polega na umieszczeniu repozytorium na warstwie Mongo Linq, aby można było bezpośrednio pracować z obiektami zapytań <>, robić swoje rejestrowanie, a następnie zwracać IQueryable zamiast próbować konwertować IQueryable do zapytania <> – cirrus

+0

dzięki za pomoc. Twoje rozwiązanie w rzeczywistości się nie kompiluje. Zobacz moje aktualizacje na temat tego, co faktycznie działa dla mnie (zauważ, że muszę zgrać głęboko w wyrażeniu, aby uzyskać klauzulę "where"). – kelloti

5

Jeśli chcesz tę funkcję w bibliotece, po prostu stworzony projekt GitHub prawo

MongoDB pomocnik zapytania NET

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

Będzie:

  • Wyjaśnij zapytanie LINQ y jako silnie typami obiektu (czy użyć indeksu na przykład)
  • przekonwertować kwerendy LINQ do kodu wykonywanie kodu JavaScript w MongoDB

Sprawdź to i przyczynić się, jeśli okaże się to interesujące.

2

Tak, istnieje. To pokazuje wszystko .explain robi i ma wartość logiczną dla gadatliwości (obejmuje czasu zajęło wykonanie):

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

nie pokazuje zapytanie chociaż. Oto metoda rozszerzenie dla że:

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

Zastosowanie:

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

W MongoDB 3 C# I używany następujący:

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

Wynik:

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