我正在编写一个非常非常简单的查询,它根据其唯一ID从集合中获取文档。经过一些frusteration(我是mongo和async / await编程模型的新手)后,我想出了这个:
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;
很有效!但我一直看到对“查找”方法的引用,我就是这样做的:
IMongoCollection<TModel> collection = // ...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;
事实证明,这太有用了,太棒了!
我确信我们有两种不同的方法来实现这些结果。这些方法有什么区别,为什么我要选择其中一种?
答案 0 :(得分:25)
区别在于语法。
Find
和FindAsync
都允许以相同的性能构建异步查询,只有
FindAsync
返回光标,不会一次加载所有文档,并为您提供从数据库光标逐个检索文档的界面。如果查询结果很大,它会很有用。
Find
通过方法ToListAsync
为您提供更简单的语法,其中内部文件从光标检索文档,一次性返回所有文档。
答案 1 :(得分:-1)
假设您在Web请求中执行此代码,通过调用find方法,请求的线程将被冻结,直到数据库返回结果为同步调用,如果这是一个需要几秒钟才能完成的长数据库操作,您将有一个线程可用于提供Web请求,只是等待数据库返回结果,浪费宝贵的资源(线程池中的线程数量有限)。
使用FindAsync,在等待数据库返回结果时,Web请求的线程将是空闲的,这意味着在数据库调用期间,此线程可以自由地参加另一个Web请求。当数据库返回结果时,代码继续执行。
对于长时间的操作,例如从文件系统读取/写入,数据库操作,与其他服务通信,使用异步调用是个好主意。因为在等待结果时,线程可用于提供另一个Web请求。这更具可扩展性。
查看这篇微软文章https://msdn.microsoft.com/en-us/magazine/dn802603.aspx。