在 ASP.NET Core 中使用分区键的 CosmosDB 查询错误

问题描述 投票:0回答:1

我正在开发一个应用程序,该应用程序根据对象 ID 从 NoSQL CosmosDB 中提取对象。该容器具有以下详细信息:

  • 容器名称:场景表
  • 分区键:/_partitionKey
  • 类型:非分层

相关方法如下:

[HttpGet("GetScenario/{scenarioId}")]
public async Task<string> GetScenarioAsync(string scenarioId, [FromQuery] string version = "")
{
    Scenario result;
    if (string.IsNullOrEmpty(version) || string.Equals(version, "undefined"))
    {
        result = await repository.GetItemByQueryAsync(s => s.Id == scenarioId).ConfigureAwait(false);
    }
    else
    {
        result = await historyRepository.GetItemByQueryAsync(s => s.Id == scenarioId).ConfigureAwait(false);
    }

    if (result != null)
    {
        return JsonConvert.SerializeObject(result);
    }
    else
    {
        throw new ApplicationException($"Could not retrieve scenario definition");
    }
}

public async Task<T> GetItemByQueryAsync(Expression<Func<T, bool>> predicate)
{
    var result = await GetDocumentsCollectionAsync(predicate).ConfigureAwait(false);
    return result.FirstOrDefault();
}

private async Task<IEnumerable<T>> GetDocumentsCollectionAsync(Expression<Func<T, bool>> predicate)
{
    IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
        this.documentCollectionUri,
        new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true, PartitionKey = new PartitionKey("_partitionKey") })
        .Where(predicate)
        .AsDocumentQuery();

    List<T> results = new List<T>();
    while (query.HasMoreResults)
    {
        results.AddRange(await query.ExecuteNextAsync<T>().ConfigureAwait(false));
    }

    return results;
}

这是错误: Microsoft.Azure.Documents.DocumentClientException:需要跨分区查询,但已禁用。请将 x-ms-documentdb-query-enablecrosspartition 设置为 true、指定 x-ms-documentdb-partitionkey 或修改查询以避免此异常。 ActivityId:9ce56a2c-d5ec-45d8-ad39-a78ef6f5ffa2,Microsoft.Azure.Documents.Common/2.14.0,Windows/10.0.20348 documentdb-netcore-sdk/2.11.6 在 Microsoft.Azure.Documents.GatewayStoreClient.ParseResponseAsync(HttpResponseMessage 响应消息、JsonSerializerSettings 序列化器设置、DocumentServiceRequest 请求) 在 Microsoft.Azure.Documents.GatewayStoreClient.InvokeAsync(DocumentServiceRequest 请求、ResourceType 资源类型、Uri 物理地址、CancellationToken 取消令牌) 在 Microsoft.Azure.Documents.GatewayStoreModel.ProcessMessageAsync(DocumentServiceRequest 请求,CancellationToken CancellationToken) 在 Microsoft.Azure.Documents.Client.DocumentClient.ProcessRequestAsync(DocumentServiceRequest 请求、IDocumentClientRetryPolicy retryPolicyInstance、CancellationToken CancellationToken) 在 Microsoft.Azure.Documents.Client.DocumentClient.ProcessRequestAsync(字符串动词、DocumentServiceRequest 请求、IDocumentClientRetryPolicy retryPolicyInstance、CancellationToken CancellationToken、String testAuthorization) 在 Microsoft.Azure.Documents.Query.DocumentQueryExecutionContextBase.ExecuteQueryRequestInternalAsync(DocumentServiceRequest 请求、IDocumentClientRetryPolicy retryPolicyInstance、CancellationToken CancellationToken) 在 Microsoft.Azure.Documents.Query.DocumentQueryExecutionContextBase.ExecuteQueryRequestAsync(DocumentServiceRequest 请求、IDocumentClientRetryPolicy retryPolicyInstance、CancellationToken CancellationToken) 在 Microsoft.Azure.Documents.Query.DefaultDocumentQueryExecutionContext.ExecuteOnceAsync(IDocumentClientRetryPolicy retryPolicyInstance,CancellationToken CancellationToken) 在 Microsoft.Azure.Documents.Query.DefaultDocumentQueryExecutionContext.<>c__DisplayClass8_0.d.MoveNext() --- 先前位置的堆栈跟踪结束 --- 在 Microsoft.Azure.Documents.BackoffRetryUtility

1.ExecuteRetryAsync(Func
1 回调方法,

我尝试在 FeedOptions 中将参数“EnableCrossPartition”设置为 true,但它仍然不起作用

c# .net azure nuget azure-cosmosdb
1个回答
0
投票
new FeedOptions { 
  MaxItemCount = -1, 
  EnableCrossPartitionQuery = true, 
  PartitionKey = new PartitionKey("_partitionKey") })
        

这既指定了EnableCrossPartitionQuery,又指定了PartitionKey,二选一。

PartitionKey 参数应具有分区键值,而不是路径。如果您的容器按

/_partitionKey
分区,那么它应该具有您要查询的文档组的属性
_partitionKey
的值。

例如,如果

_partitionKey
具有文档分配到的国家/地区名称,那么您应该执行
new PartitionKey("USA")
来查询该国家/地区的文档。

如果您的目的不是按分区键进行过滤,请将其从 FeedOptions 中删除。

顺便说明一下:您正在使用的 SDK (Microsoft.Azure.DocumentDB.Core 2.11.6) 将在 3 个月内完全失去支持。请考虑迁移。

参考资料:

  • https://learn.microsoft.com/azure/cosmos-db/nosql/sdk-dotnet-core-v2
  • https://learn.microsoft.com/azure/cosmos-db/nosql/migrate-dotnet-v3?tabs=dotnet-v3
© www.soinside.com 2019 - 2024. All rights reserved.