CosmosDb Mongo数据库请求问题

时间:2019-07-16 12:21:58

标签: c# azure-cosmosdb azure-cosmosdb-mongoapi

我有一个.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的重试策略中添加这种类型的异常吗?

1 个答案:

答案 0 :(得分:0)

由于我们已经确定您的Cosmos数据库具有数百万条记录,并且当前已在_id(您的查询中未包括的字段)上进行分区,因此这将导致巨大的跨分区查询。

我不熟悉该错误,但是,它可能是与资源相关的错误,因为查询太大而无法执行?唯一可以排除的方法是执行包含PK的查询或重新建模数据库以使用更适合您正在执行的查询类型的PK。

此外,如果您对错误本身进行了一些深入的研究,则在两种情况下,错误本身实际上是错误的结果:

因此值得研究您的工具集,并确保您都了解最新的SDK版本。