Linqクエリで.explain()
または同等の機能を実行する方法はありますか?私は、また、クエリ の実行時間を持っていいだろうMongoDB Linqの "Explain Query"はありますか?
- 実際のJSONクエリのテキスト
.explain()
(使用されるインデックスなど)- の出力知りたいでしょう
Linqクエリで.explain()
または同等の機能を実行する方法はありますか?私は、また、クエリ の実行時間を持っていいだろうMongoDB Linqの "Explain Query"はありますか?
.explain()
(使用されるインデックスなど)クエリーラッパーを持っていれば、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()
ライブラリでこの機能が必要な場合、私はちょうど.NET
https://github.com/mikeckennedy/mongodb-query-helper-for-dotnet
それはなりますため
MongoDBのクエリヘルパー題しGitHubのプロジェクト作成:
をMongoDBのにJavaScriptコードを実行するためにLINQクエリを変換し
はい、あります。それはしかし、クエリが表示されない
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);
は、私は次のように使用:
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)
感謝。ほとんどのクエリは 'IQueryable'オブジェクトからのものです。もっと良い質問は、 'IQueryable'を' IMongoQuery'に変換する方法でしょうか? – kelloti
そのような方向に行くのは簡単ではありませんが、あなたはそれを行うことができます - 更新された答えをご覧ください。もう一つのアプローチは、リポジトリをMongo Linqレイヤーに置くことで、Query <>オブジェクトを直接操作し、ログを作成してIQueryableを返すのではなく、IQueryableをQuery <> – cirrus
に助けてくれました。あなたのソリューションは実際にはコンパイルされません。実際に私のために働くものについては私の更新を見てください( 'where'節を得るために' Expression'を深く掘り下げなければならないことに注意してください)。 – kelloti