0

假设我使用 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();

我想查看发送到 mongo 服务器的翻译后的 BSON 命令(即“db.somecollection.find({...})”。

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

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

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

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

4

2 回答 2

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 的状态,检查“Query”、“Skip”、“Limit”等属性以及“Options”集合中的所有项目。

于 2013-02-28T00:23:41.720 回答
0

就像是:

var queryable= (MongoQueryable<BsonDocument>)someCollection;
var debug = queryable.GetMongoQuery().ToJson();
于 2013-02-25T07:10:27.200 回答