C# CosmosDb Mongo数据库请求问题

C# CosmosDb Mongo数据库请求问题,c#,azure-cosmosdb,azure-cosmosdb-mongoapi,C#,Azure Cosmosdb,Azure Cosmosdb Mongoapi,我有一个与CosmosDb上的mongoDb数据库交互的.Net应用程序 我有一个查找请求,看起来像这样: public async Task<int?> GetCurrentZonierVersionNumberAsync(string productCode, string risqueType) { if (string.IsNullOrEmpty(productCode) || string.IsNullOrEmpty(risqueType)) {

我有一个与CosmosDb上的mongoDb数据库交互的.Net应用程序

我有一个
查找
请求,看起来像这样:

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;
}
公共异步任务GetCurrentZonierVersionNumberSync(字符串productCode,字符串risqueType)
{
if(string.IsNullOrEmpty(productCode)| string.IsNullOrEmpty(risqueType))
{
抛出新ArgumentNullException();
}
var filter=Builders.filter.And(
Builders.Filter.Eq(x=>x.ProductCode,ProductCode),
Builders.Filter.Eq(c=>c.RisqueType,RisqueType));
分区结果=空;
尝试
{
var query=_collection.Find(filter).SortByDescending(x=>x.Version).Limit(1).FirstOrDefaultAsync();
wait\u retryPolicy.ExecuteAsync(异步()=>
{
结果=等待查询;
});
}
捕获(TimeoutException例外)
{
抛出新的DataBaseReadingException(例如Message、ExceptionDeconstants.DataBaseReadingExceptionCode);
}
返回结果?.Version;
}
很遗憾,我在azure上收到以下错误消息:

未处理的异常:MongoDB.Driver.MongoCommandException:命令查找失败:网关无法直接为提供的跨分区查询提供服务。这是所有新客户端都知道如何优雅地处理的第一次机会(内部)异常。可以跟踪此异常,但除非您将其视为异常(仅发生在较旧的SDK客户端上),否则您可以安全地忽略此消息

我不明白发生了什么事。有人能给我解释一下错误信息吗。 我有2.4.4版本的mongo驱动程序。我知道我应该更新它,但我担心它会隐藏问题而不解决它。
我应该在Polly的重试策略中添加这种类型的异常吗?

因为我们已经确定您的Cosmos DB有数百万条记录,并且当前在
\u id
上进行分区(您不包括在查询中的字段),那么这将导致一个巨大的跨分区查询

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

此外,如果您对错误本身进行了一些挖掘,则有两种情况下错误本身实际上是由错误导致的:


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

更新到mongodb驱动程序的最新版本,但仍然存在相同的问题。表是如何分区的?首先,在
\u id
fieldsee上有一个分区键。@James它帮助我了解了它的工作原理。我还有一个问题,但似乎与这个话题无关。多谢各位!