MongoDB Linq是否有“解释查询”?

有没有办法在Linq查询上运行.explain()或等效的? 我想知道

  • 实际JSON查询的文本
  • .explain()的输出(使用的索引等)
  • 拥有查询的执行时间也很好

如果你有一个查询包装器,你可以很容易地获得Json;

 var qLinq = Query.Where(x => x.name=="jim"); Console.WriteLine(qLinq.ToJson()); 

MongoCursor上还有一个Explain()方法,所以你可以这样做;

 var exp = Collection.FindAs(qLinq).Explain() Console.WriteLine(exp.ToJson()); 

所以,如果你想要花时间,“毫米”就在那里;

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

如果您想在库中使用此function,我只需创建一个名为的GitHub项目

用于.NET的MongoDB查询助手

https://github.com/mikeckennedy/mongodb-query-helper-for-dotnet

它会:

  • 将LINQ查询解释为强类型对象 (例如,它是否使用索引)
  • 将LINQ查询转换为MongoDB中运行的JavaScript代码

如果您觉得有趣,请查看并做出贡献。

就在这里。 它显示了.explain所做的一切,并且具有冗长的布尔值(它包括执行所花费的时间):

 var database = new MongoClient().GetServer().GetDatabase("db"); var collection = database.GetCollection("Hamsters"); var explanation = collection.AsQueryable().Where(hamster => hamster.Name == "bar").Explain(true); Console.WriteLine(explanation); 

它不会显示查询。 这是一个扩展方法:

 public static string GetMongoQuery(this IQueryable query) { var mongoQuery = query as MongoQueryable; 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("Users"); var r = users(m => m._id == yourIdHere) .Project(m => new { m._id, m.UserName, m.FirstName, m.LastName }) .Limit(1); Console.WriteLine(users.ToString()); 

结果:

 find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1)