2012-11-06 37 views
9

Có cách nào để chạy .explain() hoặc tương đương trên truy vấn LINQ không? Tôi muốn biếtCó một "Truy vấn Giải thích" cho MongoDB Linq không?

  • Các văn bản của các truy vấn JSON thực tế
  • Kết quả của .explain() (chỉ số được sử dụng, vv)
  • Nó cũng sẽ được tốt đẹp để có thời gian thực hiện các truy vấn

Trả lời

10

Bạn có thể lấy Json đủ dễ dàng nếu bạn có trình bao bọc truy vấn;

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

Còn có phương thức Explain() trên MongoCursor, vì vậy bạn có thể thực hiện việc này;

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

Vì vậy, nếu bạn muốn có thời gian, "millis" ở trong đó;

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

Nếu bạn có IQueryable, hãy thử một cái gì đó như thế này;

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

Cảm ơn. Hầu hết các truy vấn của chúng tôi là từ các đối tượng 'IQueryable'. Có lẽ câu hỏi hay hơn là làm thế nào để biến một 'IQueryable' thành một' IMongoQuery'? – kelloti

+0

Đó không phải là dễ dàng như vậy để đi theo hướng đó, nhưng bạn có thể làm điều đó - xem câu trả lời cập nhật. Cách tiếp cận khác là đặt một Kho lưu trữ trên lớp Mongo Linq để bạn có thể làm việc trực tiếp với các đối tượng Query, hãy ghi nhật ký của bạn rồi trả về IQueryable thay vì thử và chuyển đổi IQueryable thành Query <> – cirrus

+0

nhờ sự trợ giúp. Giải pháp của bạn không thực sự biên dịch mặc dù. Xem các cập nhật của tôi cho những gì thực sự làm việc cho tôi (lưu ý cách tôi phải trích xuất sâu vào 'Expression' để nhận mệnh đề' where'). – kelloti

5

Nếu bạn muốn chức năng này trong thư viện, tôi vừa tạo ra một dự án GitHub quyền

MongoDB helper truy vấn cho .NET

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

Nó sẽ:

  • Giải thích câu hỏi LINQ y như một đối tượng mạnh mẽ gõ (nó sử dụng một chỉ số chẳng hạn)
  • Chuyển đổi một truy vấn LINQ to mã chạy JavaScript trong MongoDB

Kiểm tra nó ra và đóng góp nếu bạn tìm thấy nó thú vị.

2

Có, có. Nó cho thấy tất cả mọi thứ .explain làm và có một boolean cho rườm rà (nó bao gồm thời gian nó đã thực hiện):

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

nó không hiển thị các truy vấn mặc dù. Dưới đây là một phương pháp khuyến nông cho rằng:

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

Cách sử dụng:

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

Trong MongoDB 3 C# Tôi sử dụng sau đây:

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

Kết quả:

find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1) 
Các vấn đề liên quan