Mongodb C#驱动程序 - 从C#代码获取翻译的BSON

时间:2013-02-22 22:04:24

标签: mongodb mongodb-.net-driver

假设我使用C#驱动程序设置了以下光标:

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

我希望看到转发的BSON命令被发送到mongo服务器(即“db.somecollection.find({...})”。

无论哪种方式都可以接受:

1。某种将函数打印为字符串的函数。

2. 某种“嗅探”发送到服务器的命令的方法。 (mongo.exe中的db分析功能仅显示where子句和order by - 我想查看所有内容 - 限制,字段预测等)

此外,使用MongoQueryable执行此操作也很棒。

2 个答案:

答案 0 :(得分:0)

类似的东西:

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

答案 1 :(得分: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的状态,检查“查询”,“跳过”,“限制”等属性以及“选项”集合中的所有项目。