2013-02-22 51 views
0

說我有以下光標設置使用C#驅動程序:蒙戈DB C#驅動程序 - 充分利用C#代碼翻譯BSON

 var cursor = _mongoClient.GetServer() 
           .GetDatabase("test") 
           .GetCollection<BsonDocument>("somecollection") 
           .Find(Query.EQ("field", "value")) 
           .SetFields(Fields.Exclude()) 
           .SetLimit(5) 
           .SetSortOrder("field"); 
    var results = cursor.ToList(); 

我希望看到被髮送到蒙戈服務器tranlated BSON命令( 。即 「db.somecollection.find({...})」

無論哪種方式是可以接受的。

某種功能,將打印這是一個字符串

2.某種方式可以「嗅探」發送到服務器的命令。 (該數據庫中mongo.exe剖析功能只顯示其中由--I子句和order想看到的一切--limit,場預測等)

而且,與MongoQueryable這樣做將是巨大的好。

回答

0

喜歡的東西:

var queryable= (MongoQueryable<BsonDocument>)someCollection; 
var debug = queryable.GetMongoQuery().ToJson(); 
+1

這將只顯示可疑的「where」部分。我想看到的一切 - 在哪裏,排序,跳過,限制,字段等。 – drogon 2013-02-28 00:26:48

0

所以,它看起來像MongoCursor的序列化類內部的MongoDB.Driver組件內封裝。因此,發送到服務器的序列化BSON消息至少在客戶端代碼中不可見。

但是,我可以合理地相信MongoCursor在較低級別正確翻譯。 (畢竟,10gen就落後於這個項目。)

更大的問題是如何翻譯LINQ表達式。如果我可以驗證LINQ IQueryables被轉換爲具有正確狀態的MongoCursor,那我就是金。

所以,這裏是一個擴展方法拉光標出的IQueryable的:

public static class MongoExtensions 
    { 

     public static MongoCursor GetCursor<T>(this IQueryable<T> source) 
     { 
      var queryProvider = source.Provider as MongoQueryProvider; 
      if (queryProvider == null) 
      { 
       throw new NotSupportedException("Explain can only be called on a Linq to Mongo queryable."); 
      } 

      var selectQuery = (SelectQuery)MongoQueryTranslator.Translate(queryProvider, source.Expression); 

      if (selectQuery.Take.HasValue && selectQuery.Take.Value == 0) 
      { 
       throw new NotSupportedException("A query that has a .Take(0) expression will not be sent to the server and can't be explained"); 
      } 

      var projector = selectQuery.Execute(); 

      var cursorProp = projector.GetType().GetProperties().FirstOrDefault(p => p.Name == "Cursor"); 
      return cursorProp.GetValue(projector) as MongoCursor<T>; 

     } 
    } 

然後我可以測試MongoCursor的狀態,檢查像「查詢」,「跳過」性質,「限制「和」選項「集合中的所有項目。