2012-11-06 31 views

回答

10

如果您有查詢包裝器,您可以輕鬆獲得Json;

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

對MongoCursor還有一個Explain()方法,所以你可以這樣做;

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

所以,如果你想要的時間,「millis」在那裏;

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

如果你有一個IQueryable,嘗試類似這樣;

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

感謝。我們大多數查詢來自'IQueryable'對象。也許更好的問題是如何將'IQueryable'變成'IMongoQuery'? – kelloti

+0

這並不容易,但你可以做到 - 看到更新的答案。另一種方法是在Mongo Linq層上放置一個Repository,這樣你就可以直接使用Query <>對象,做你的日誌記錄然後返回IQueryable,而不是嘗試將IQueryable轉換爲Query <> – cirrus

+0

感謝您的幫助。儘管您的解決方案實際上並未編譯。查看我的更新,瞭解實際爲我工作的內容(注意,我必須深入研究'Expression'以獲取where子句)。 – kelloti

5

如果你想在圖書館這個功能,我剛剛創建了一個GitHub的項目名爲

MongoDB的查詢幫手.NET

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

它將:

  • 解釋一個LINQ查詢器Ÿ作爲一個強類型的對象(它使用例如索引)
  • 轉換LINQ查詢到的JavaScript代碼運行在MongoDB中

檢查出來,如果你覺得有趣的貢獻。

2

是的,有。這表明一切.explain不和有冗長的布爾(它包括花費的執行時間):

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

它並不雖然顯示查詢。下面是該擴展方法:

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

用法:

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

MongoDB中3 C#我用以下:

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

結果:

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