假设我使用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执行此操作也很棒。
答案 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的状态,检查“查询”,“跳过”,“限制”等属性以及“选项”集合中的所有项目。