2012-11-06 16 views
9

.explain() veya Linq sorgularında eşdeğer bir yol mu var? BenMongoDB Linq için bir "Explain Query" var mı?

  • gerçek JSON sorgusunun metni bilmek istersiniz
  • Ayrıca sorgunun yürütme zamanı olması güzel olurdu
  • (kullanılmış endeksler, vs) .explain() çıkışı

cevap

10

Bir sorgu sarıcınız varsa Json'u kolayca alabilirsiniz; Bunu böylece

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

, ayrıca MongoCursor üzerinde açıklayınız() yöntemi yoktur;

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

Alınan süreyi istiyorsan, "millis" içeride; Bir IQueryable varsa

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

, böyle bir şey deneyin; Eğer bir kütüphanede bu işlevselliği isterseniz

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

teşekkürler. Sorgularımızın çoğu 'IQueryable' nesnelerine aittir. Belki de daha iyi soru, bir “IQueryable” ın bir “IMongoQuery” ye dönüştürülmesidir? – kelloti

+0

Bu yönde gitmek o kadar kolay değil, ancak bunu yapabilirsiniz - güncellenmiş cevabı gör. Diğer bir yaklaşım ise bir Deponun Mongo Linq katmanına yerleştirilmesidir, böylece Query <> nesnelerle doğrudan çalışabilir, günlüğünüzü yapabilir ve daha sonra IQueryable'ı sorgulamak yerine IQueryable değerini döndürür <> – cirrus

+0

yardım için teşekkürler. Çözümünüz aslında değil. Benim için gerçekte neyin işe yaradığına dair güncellemelerimi görün ('' '' '' 'fıkra '' kelimesini elde etmek için' İfade''ye derinlemesine bakmak zorunda olduğumu not alın. – kelloti

5

, sadece bir GitHub proje

başlıklı oluşturulan

MongoDB sorgu yardımcı NET

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

için O olacak:

  • LINQ sorgusunu açıklayın kesinlikle yazılı bir nesne (örneğin bir dizin kullanır)
  • MongoDB
  • JavaScript kodu çalıştırmak için bir LINQ sorgusu dönüştürme olarak y

dışarı atın ve ilginç bulursanız katkıda bulunur.

2

Evet, var. Gerçi sorgu göstermiyor

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

: Öyle ve ayrıntı için bir boolean (o yürütmek için geçen zamanı içerir) sahiptir .explain her şeyi gösterir. İşte bunun için bir uzantısı yöntemidir:

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

Kullanımı: mongodb 3 C#

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

aşağıdaki kullandı:

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

Sonuç:

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