Cosmos DB 的分区键
Partition Key for Cosmos DB
我正在使用 ASP.NET Core 和 Cosmos DB 构建一个 restful API。有一个需要分区键的 GetItemById 请求。
public static async Task<T> GetItemAsync(string itemId, string name)
{
try
{
Document document =
await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, itemId),
new RequestOptions() { PartitionKey = new PartitionKey(name) });
return (T)(dynamic)document;
}
catch (DocumentClientException e)
{
if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
{
return null;
}
else
{
throw;
}
}
}
GetByIdAsync() 函数调用此 GetItemAsync() 方法。
[HttpGet("{itemId}")]
public async Task<IActionResult> GetByIdAsync(string itemId, string name)
{
var item = await DocumentDBRepository<TodoItem>.GetItemAsync(itemId, name);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}
URL 将是 http://localhost:54084/api/todo/f323307b-142f-46f3-9072-12f41cc74e87
我的 Azure CosmosDB 容器如下所示:
但是当我 运行 这个时,它给了我一个错误
{Microsoft.Azure.Documents.DocumentClientException: Partition key
provided either doesn't correspond to definition in the collection or
doesn't match partition key field values specified in the document.
在 Cosmos DB 中,主键是分区键和行键的组合 ("id")。两者的组合唯一标识一行 - 而不是单独的 "id"。因此,您需要在分区键中指定 Name 的值才能找到该项目(非空)。
如果您的应用没有自然主键,那么您应该考虑将“/id”设置为分区键(并传递 id 和分区键的值)
我明白了。我收到此错误的原因是因为我没有在我的集合中设置分区键。这就是为什么我应该删除
new RequestOptions() { PartitionKey = new PartitionKey(name) }
我删除后,它工作正常。
我正在使用 ASP.NET Core 和 Cosmos DB 构建一个 restful API。有一个需要分区键的 GetItemById 请求。
public static async Task<T> GetItemAsync(string itemId, string name)
{
try
{
Document document =
await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, itemId),
new RequestOptions() { PartitionKey = new PartitionKey(name) });
return (T)(dynamic)document;
}
catch (DocumentClientException e)
{
if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
{
return null;
}
else
{
throw;
}
}
}
GetByIdAsync() 函数调用此 GetItemAsync() 方法。
[HttpGet("{itemId}")]
public async Task<IActionResult> GetByIdAsync(string itemId, string name)
{
var item = await DocumentDBRepository<TodoItem>.GetItemAsync(itemId, name);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}
URL 将是 http://localhost:54084/api/todo/f323307b-142f-46f3-9072-12f41cc74e87
我的 Azure CosmosDB 容器如下所示:
但是当我 运行 这个时,它给了我一个错误
{Microsoft.Azure.Documents.DocumentClientException: Partition key provided either doesn't correspond to definition in the collection or doesn't match partition key field values specified in the document.
在 Cosmos DB 中,主键是分区键和行键的组合 ("id")。两者的组合唯一标识一行 - 而不是单独的 "id"。因此,您需要在分区键中指定 Name 的值才能找到该项目(非空)。
如果您的应用没有自然主键,那么您应该考虑将“/id”设置为分区键(并传递 id 和分区键的值)
我明白了。我收到此错误的原因是因为我没有在我的集合中设置分区键。这就是为什么我应该删除
new RequestOptions() { PartitionKey = new PartitionKey(name) }
我删除后,它工作正常。