13

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

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

4 回答 4

12

如果你有一个查询包装器,你可以很容易地获得 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());

因此,如果您想要花费时间,“毫秒”就在那里;

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()
于 2012-11-07T00:00:26.923 回答
5

如果您希望在库中使用此功能,我刚刚创建了一个名为 GitHub 的项目

.NET 的 MongoDB 查询助手

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

它会:

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

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

于 2014-03-06T00:53:28.897 回答
2

就在这里。它显示了所有内容.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);
于 2014-07-25T17:06:05.297 回答
1

在 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) 
于 2015-09-25T16:43:53.997 回答