6

我正在使用 MongoDB.Driver 2.0.0。有没有办法查看从 linq 到 MongoDB 的生成脚本?

例如我的查询是这样的:

IFindFluent<ProductMapping, ProductMapping> findFluent = Collection.Find(
    x => hashValues.Contains(x.UrlHash) && x.ProductTopic == topicId);

这个(或更复杂的查询)如何在 MongoDB shell 中表示?

4

2 回答 2

16

编辑:从驱动程序的 2.0.1 版本开始,FindFluent返回的对象IMongoCollection.Find有一个适当的ToString,包括过滤器,还有一个投影、排序等(如果相关)。

所以,为此:

var findFluent = collection.
    Find(x => hashValues.Contains(x.UrlHash) && x.ProductTopic == topicId,
        new FindOptions {MaxTime = TimeSpan.FromSeconds(1)}).
    Project(x => x.UrlHash).
    Sort(Builders<ProductMapping>.Sort.Descending(x => x.ProductTopic)).
    Skip(6).
    Limit(7);

Console.WriteLine(findFluent);

输出将是:

find({ "UrlHash" : { "$in" : [4, 5, 6, 7, 8] }, "ProductTopic" : 200 }, { "UrlHash" : 1, "_id" : 0 }).
sort({ "ProductTopic" : -1 }).
skip(6).
limit(7).
maxTime(1000)

好吧,您已经知道您正在查找,所以我假设您想知道查询的样子。

您可以使用以下代码轻松地直接从您的代码中执行此操作IFindFluent.Filter

BsonDocument filterDocument = findFluent.Filter.Render(
    collection.DocumentSerializer,
    collection.Settings.SerializerRegistry);

Console.WriteLine(filterDocument);

hashValues您的情况下的输出(当然取决于topicId):

{ "UrlHash" : { "$in" : [4, 5, 6, 7, 8, 9] }, "ProductTopic" : 200 }
于 2015-05-18T16:06:01.667 回答
4

编辑

Render()请参阅 i3arnon 的答案,了解使用通常更容易的客户端方法。


您可以使用集成的 mongodb 分析器来查看数据库实际收到的内容:

db.setProfilingLevel(2); // log every request

// show the requests that mongodb has received, along with execution stats:
db.system.profile.find().pretty() 

或者,您可以单步执行驱动程序的源代码并等待它实际创建消息。但是,这需要从源代码 AFAIK 编译驱动程序。

于 2015-05-18T15:11:28.307 回答