10

I am using MongoDB.Driver 2.0.0. Is there any way to see a generated script from linq to MongoDB?

For example my query is like:

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

How would this (or more complex queries) be represented in the MongoDB shell?

2 Answers 2

21

EDIT: As of the 2.0.1 version of the driver the FindFluent object returned from IMongoCollection.Find has an appropriate ToString that includes the filter, but also a projection, sort and so forth (if relevant).

So, for this:

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

The output would be:

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

Well, you already know you are doing a find so I assume you want to know what the query looks like.

You can easily do that directly from your code using IFindFluent.Filter:

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

Console.WriteLine(filterDocument);

The output in your case (depends on hashValues and topicId of course):

{ "UrlHash" : { "$in" : [4, 5, 6, 7, 8, 9] }, "ProductTopic" : 200 }
Sign up to request clarification or add additional context in comments.

Comments

5

EDIT

Please see i3arnon's answer for a client-side method using Render() that is usually easier.


You can use the integrated mongodb profiler to see what the database has actually received:

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

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

Alternatively, you can step in the source code of the driver and wait for it to actually create the message. That, however, requires compiling the driver from source, AFAIK.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.