【发布时间】:2012-10-26 15:03:26
【问题描述】:
有没有办法在 Linq 查询上运行 .explain() 或等效项?我想知道
- 实际 JSON 查询的文本
-
.explain()的输出(使用的索引等) - 如果有查询的执行时间也很好
【问题讨论】:
标签: c# linq mongodb query-optimization mongodb-.net-driver
有没有办法在 Linq 查询上运行 .explain() 或等效项?我想知道
.explain() 的输出(使用的索引等)【问题讨论】:
标签: c# linq mongodb query-optimization mongodb-.net-driver
如果你有一个查询包装器,你可以很容易地获得 Json;
var qLinq = Query<T>.Where(x => x.name=="jim");
Console.WriteLine(qLinq.ToJson());
MongoCursor 上还有一个 Explain() 方法,所以你可以这样做;
var exp = Collection.FindAs<T>(qLinq).Explain()
Console.WriteLine(exp.ToJson());
所以如果你想花时间,“millis”就在那里;
var msTaken = exp.First(x => x.Name == "millis").Value.AsInt32;
如果你有IQueryable,试试这样的;
void Do(MongoCollection col, IQueryable iq)
{
// Json Mongo Query
var imq = (iq as MongoQueryable<Blob>).GetMongoQuery();
Console.WriteLine(imq.ToString());
// you could also just do;
// var cursor = col.FindAs(typeof(Blob), imq);
var cursor = MongoCursor.Create(typeof(Blob), col, imq, ReadPreference.Nearest);
var explainDoc = cursor.Explain();
Console.WriteLine(explainDoc);
}//Do()
【讨论】:
IQueryable 对象。也许更好的问题是如何将IQueryable 变成IMongoQuery?
Expression 以获得where 子句)。
如果您希望在库中使用此功能,我刚刚创建了一个名为
的 GitHub 项目.NET 的 MongoDB 查询助手
https://github.com/mikeckennedy/mongodb-query-helper-for-dotnet
它会:
如果您觉得有趣,请查看并贡献。
【讨论】:
是的,有。它显示了.explain 所做的所有事情,并且有一个用于详细说明的布尔值(包括执行时间):
var database = new MongoClient().GetServer().GetDatabase("db");
var collection = database.GetCollection<Hamster>("Hamsters");
var explanation = collection.AsQueryable().Where(hamster => hamster.Name == "bar").Explain(true);
Console.WriteLine(explanation);
但它不显示查询。这是一个扩展方法:
public static string GetMongoQuery<TItem>(this IQueryable<TItem> query)
{
var mongoQuery = query as MongoQueryable<TItem>;
return mongoQuery == null ? null : mongoQuery.GetMongoQuery().ToString();
}
用法:
var query = collection.AsQueryable().Where(hamster => hamster.Name == "bar").GetMongoQuery();
Console.WriteLine(query);
【讨论】:
在 mongodb 3 C# 中,我使用了以下内容:
var users = Mongo.db.GetCollection<User>("Users");
var r = users(m => m._id == yourIdHere)
.Project(m => new { m._id, m.UserName, m.FirstName, m.LastName })
.Limit(1);
Console.WriteLine(r.ToString());
结果:
find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1)
【讨论】:
r.ToString()吗?我对上面的代码如何产生你指定的结果感到困惑。