我有一个.Net应用程序,它与CosmosDb上的mongoDb数据库进行交互。
我有一个find
请求,看起来像这样:
public async Task<int?> GetCurrentZonierVersionNumberAsync(string productCode, string risqueType)
{
if (string.IsNullOrEmpty(productCode) || string.IsNullOrEmpty(risqueType))
{
throw new ArgumentNullException();
}
var filter = Builders<Zonier>.Filter.And(
Builders<Zonier>.Filter.Eq(x => x.ProductCode, productCode),
Builders<Zonier>.Filter.Eq(c => c.RisqueType, risqueType));
Zonier result = null;
try
{
var query = _collection.Find(filter).SortByDescending(x => x.Version).Limit(1).FirstOrDefaultAsync();
await _retryPolicy.ExecuteAsync(async () =>
{
result = await query;
});
}
catch (TimeoutException ex)
{
throw new DataBaseReadingException(ex.Message, ExceptionCodeConstants.DataBaseReadingExceptionCode);
}
return result?.Version;
}
不幸的是,我在azure上收到以下错误消息:
未处理的异常:MongoDB.Driver.MongoCommandException:命令查找失败:网关无法直接为提供的跨分区查询提供服务。这是所有新客户都将知道如何妥善处理的第一次(内部)例外。可以跟踪此异常,但是除非您将其视为异常(仅在较旧的SDK客户端上发生),否则您可以放心地忽略此消息。
我不明白发生了什么。有人可以向我解释错误消息。 我有2.4.4版本的mongo驱动程序。我知道我应该更新它,但是我担心它会隐藏问题而不解决它。 我应该在Polly的重试策略中添加这种类型的异常吗?
答案 0 :(得分:0)
由于我们已经确定您的Cosmos数据库具有数百万条记录,并且当前已在_id
(您的查询中未包括的字段)上进行分区,因此这将导致巨大的跨分区查询。
我不熟悉该错误,但是,它可能是与资源相关的错误,因为查询太大而无法执行?唯一可以排除的方法是执行包含PK的查询或重新建模数据库以使用更适合您正在执行的查询类型的PK。
此外,如果您对错误本身进行了一些深入的研究,则在两种情况下,错误本身实际上是错误的结果:
因此值得研究您的工具集,并确保您都了解最新的SDK版本。