2012-11-06 5 views
9

Linqクエリで.explain()または同等の機能を実行する方法はありますか?私は、また、クエリ の実行時間を持っていいだろうMongoDB Linqの "Explain Query"はありますか?

  • 実際のJSONクエリのテキスト
  • .explain()(使用されるインデックスなど)
  • の出力知りたいでしょう

答えて

10

クエリーラッパーを持っていれば、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() 
+0

感謝。ほとんどのクエリは 'IQueryable'オブジェクトからのものです。もっと良い質問は、 'IQueryable'を' IMongoQuery'に変換する方法でしょうか? – kelloti

+0

そのような方向に行くのは簡単ではありませんが、あなたはそれを行うことができます - 更新された答えをご覧ください。もう一つのアプローチは、リポジトリをMongo Linqレイヤーに置くことで、Query <>オブジェクトを直接操作し、ログを作成してIQueryableを返すのではなく、IQueryableをQuery <> – cirrus

+0

に助けてくれました。あなたのソリューションは実際にはコンパイルされません。実際に私のために働くものについては私の更新を見てください( 'where'節を得るために' Expression'を深く掘り下げなければならないことに注意してください)。 – kelloti

5

ライブラリでこの機能が必要な場合、私はちょうど.NET

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

それはなりますため

MongoDBのクエリヘルパー題しGitHubのプロジェクト作成:

  • LINQクエリを説明するY

MongoDBのにJavaScriptコードを実行するためにLINQクエリを変換し

  • (それはたとえば、インデックスを使用しない)、厳密に型指定されたオブジェクト
    としてあなたはそれが面白い発見した場合、それをチェックアウトし、貢献しています。

    2

    はい、あります。それはしかし、クエリが表示されない

    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); 
    

    :それはありませんし、冗長性のためのブール値を(それが実行にかかった時間を含みます)がある.explainすべてを示しています。ここではそのための拡張メソッドです:

    public static string GetMongoQuery<TItem>(this IQueryable<TItem> query) 
    { 
        var mongoQuery = query as MongoQueryable<TItem>; 
        return mongoQuery == null ? null : mongoQuery.GetMongoQuery().ToString(); 
    } 
    

    使用法:MongoDBの3のC#で

    var query = collection.AsQueryable().Where(hamster => hamster.Name == "bar").GetMongoQuery(); 
    Console.WriteLine(query); 
    
    1

    は、私は次のように使用:

    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) 
    
    関連する問題