我正在开发一个应用程序,该应用程序根据对象 ID 从 NoSQL CosmosDB 中提取对象。该容器具有以下详细信息:
相关方法如下:
[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.
1.ExecuteRetryAsync(Func
1 回调方法,
我尝试在 FeedOptions 中将参数“EnableCrossPartition”设置为 true,但它仍然不起作用
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 个月内完全失去支持。请考虑迁移。
参考资料: