Difference between Find and FindAsync

object88 picture object88 · Jun 4, 2015 · Viewed 31.9k times · Source

I am writing a very, very simple query which just gets a document from a collection according to its unique Id. After some frusteration (I am new to mongo and the async / await programming model), I figured this out:

IMongoCollection<TModel> collection = // ...
FindOptions<TModel> options = new FindOptions<TModel> { Limit = 1 };
IAsyncCursor<TModel> task = await collection.FindAsync(x => x.Id.Equals(id), options);
List<TModel> list = await task.ToListAsync();
TModel result = list.FirstOrDefault();
return result;

It works, great! But I keep seeing references to a "Find" method, and I worked this out:

IMongoCollection<TModel> collection = // ...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;

As it turns out, this too works, great!

I'm sure that there's some important reason that we have two different ways to achieve these results. What is the difference between these methodologies, and why should I choose one over the other?

Answer

rnofenko picture rnofenko · Jun 5, 2015

The difference is in a syntax. Find and FindAsync both allows to build asynchronous query with the same performance, only

FindAsync returns cursor which doesn't load all documents at once and provides you interface to retrieve documents one by one from DB cursor. It's helpful in case when query result is huge.

Find provides you more simple syntax through method ToListAsync where it inside retrieves documents from cursor and returns all documents at once.