QMongoDB LINQ有“解释查询”吗?

在LINQ查询中是否有运行.explain()或等价物的方法?我想知道

  • 实际json查询的文本
  • .explain()(使用的索引等)的输出
  • <> LI>如果查询的执行时间也不错。
2012-11-06 17:06:36  bruce

A回答

  • 1

    如果您有一个查询包装器,就可以很容易地获得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()
    
    2014-07-29 17:34:51  Community cirrus
    • 谢谢。我们的大多数查询来自IQueryable对象。也许更好的问题是如何将IQueryable转换为IMongoQuery – kelloti Nov 7 '12 at 0:06
    • 这&39;不是那么容易朝那个方向发展,但你可以做到这一点-请参阅更新的答案。另一种方法是在mongo-linq层上放置一个存储库,以便您可以直接使用query<;gt;对象,执行日志记录,然后返回iqueryable,而不是尝试将iqueryable转换为query<; – cirrus Nov 7 '12 at 12:17
    • 感谢您的帮助。不过,您的解决方案实际上并没有编译。查看我的更新,了解真正适合我的内容(请注意,我必须深入到Expression中才能得到where子句)。 – kelloti Nov 7 '12 at 22:41
    • 抱歉,我是瞎写的。无论如何,我认为这比这容易得多。这个表达式可能是一个红鲱鱼我们真的想要一个Mongoursor,请参见上面的内容。 – cirrus Nov 8 '12 at 12:28
    • 1
      最新版本的驱动程序具有iqueryable的“explain”扩展方法。 – drogon Feb 27 '13 at 23:57
    • @ CurrutsI& 39,可能是从您的答案中删除所有文本的时间。 – JohnnyHK Jul 25 '14 at 17:22
  • 2

    如果您想在库中使用此功能,我刚刚创建了一个名为

    用于.NET的MongoDB查询帮助程序

    < HeRF=http://gthub.com /mikeknny/MangGDB查询助手,用于dotnet> http://gthuub.com /mikeknny/MangGDB查询助手,用于dotnet /p>

    它将:

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

    如果你觉得有趣的话,可以去看看,然后贡献自己的力量。

    2014-03-06 00:53:28  Michael Kennedy
  • 3

    是的,有。它显示了.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-25 17:06:05  i3arnon
  • 4

    在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(users.ToString());
    

    结果:

    find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1) 
    
    2016-01-12 12:44:52  shA.t user1195202