在检索或执行多个查询之前确认文档存在
Confirm document existance before retrieving or doing multiple queries
我需要使用用户输入从集合中检索一个 BsonDocument。我已经找到了一个简单的方法来做到这一点:
var filter = Builders<BsonDocument>.Filter.Eq("name", name);
var doc = await myCollection.Find(filter).SingleAsync();
这工作正常,但是当没有匹配项时,它会在 SingleAsync
方法中抛出一个 System.InvalidOperationException
:
Unhandled Exception: System.InvalidOperationException: Sequence contains no elements
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at MongoDB.Driver.IAsyncCursorExtensions.SingleAsync[TDocument](IAsyncCursor`1 cursor, CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.SingleAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
at MyProgram.Main.Test() in D:\MyProgram\Main.cs:line 22
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.ThreadPoolWorkQueue.Dispatch()
我想我每次都可以捕获这个异常,但这是正确的方法吗?我也可以使用 AnyAsync
检查是否存在,但这将涉及执行 2 个单独的查询,这可能会损害数据库性能。
这样做的正确方法是什么?
SingleAsync()
的问题是 SingleAsync
如果找不到恰好 1 个结果,它会故意抛出错误。解决方法是使用 FirstOrDefaultAsync()
。如果有 1 个结果,FirstOrDefault
将 return 正好是 1 个结果,如果有多个结果,则第一个结果,或者 null
如果它无法得到任何结果。
我需要使用用户输入从集合中检索一个 BsonDocument。我已经找到了一个简单的方法来做到这一点:
var filter = Builders<BsonDocument>.Filter.Eq("name", name);
var doc = await myCollection.Find(filter).SingleAsync();
这工作正常,但是当没有匹配项时,它会在 SingleAsync
方法中抛出一个 System.InvalidOperationException
:
Unhandled Exception: System.InvalidOperationException: Sequence contains no elements
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at MongoDB.Driver.IAsyncCursorExtensions.SingleAsync[TDocument](IAsyncCursor`1 cursor, CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.SingleAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
at MyProgram.Main.Test() in D:\MyProgram\Main.cs:line 22
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.ThreadPoolWorkQueue.Dispatch()
我想我每次都可以捕获这个异常,但这是正确的方法吗?我也可以使用 AnyAsync
检查是否存在,但这将涉及执行 2 个单独的查询,这可能会损害数据库性能。
这样做的正确方法是什么?
SingleAsync()
的问题是 SingleAsync
如果找不到恰好 1 个结果,它会故意抛出错误。解决方法是使用 FirstOrDefaultAsync()
。如果有 1 个结果,FirstOrDefault
将 return 正好是 1 个结果,如果有多个结果,则第一个结果,或者 null
如果它无法得到任何结果。