2013-02-22 41 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的状态,检查像“查询”,“跳过”性质,“限制“和”选项“集合中的所有项目。