Api cosmosdb的分区密钥
我正在使用ASP.NET内核和Cosmos DB构建一个restful API。有一个GetItemById请求需要一个分区键Api cosmosdb的分区密钥,api,azure,asp.net-core,azure-cosmosdb,database-partitioning,Api,Azure,Asp.net Core,Azure Cosmosdb,Database Partitioning,我正在使用ASP.NET内核和Cosmos DB构建一个restful API。有一个GetItemById请求需要一个分区键 public static async Task<T> GetItemAsync(string itemId, string name) { try { Document document = await client.ReadDocumentAsync(Uri
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将是
我的Azure CosmosDB容器如下所示:
但是当我运行这个时,它给了我一个错误
{Microsoft.Azure.Documents.DocumentClientException:分区键
提供的与集合中的定义不对应,或者
与文档中指定的分区键字段值不匹配
在Cosmos DB中,主键是分区键和行键id的组合。这两个键的组合唯一地标识一行,而不仅仅是id。因此,您需要在分区键中指定Name的值,才能找到不为null的项
如果你的应用程序没有一个自然的PK,那么你应该考虑设置/ID作为分区键,并且在COSMOS DB中传递ID和分区键
的值,主键是分区键和行键ID的组合。这两个组合唯一标识行-而不是单独的ID。因此,需要指定O值。f在分区键中的名称,以查找不为null的项如果你的应用程序没有一个自然的PK,那么你应该考虑设置/ID作为分区键,并且传递ID和分区键
< p>的值。我得出了这个结论。因为我没有在我的集合中设置分区键,所以我得到这个错误的原因。这就是为什么我应该删除 新请求选项{PartitionKey=new PartitionKeyname}在我删除它之后,它工作正常。我发现了它。我出现此错误的原因是因为我的集合中没有设置分区键。这就是我应该删除它的原因 新请求选项{PartitionKey=new PartitionKeyname}
在我删除它之后,它工作正常。您要为名称传递什么值?集合的分区键定义是什么?@AravindKrishnaR。这是我遇到的令人困惑的部分。对于您的第一个问题,我刚刚为名称传递了null。对于您的第二个问题,我不确定我们为什么需要分区键。我在想我们需要通过id获取一个项目,我们只需要它的id。这就是为什么我认为它只需要URL的id。为什么我们需要它的名称?@AravindKrishnaR。我还添加了上面分区键定义的屏幕截图。谢谢!在Cosmos DB中,主键是分区键和行键id的组合。这两个键的组合是唯一的识别一个行-而不是单独的ID。因此,需要在分区键中指定名称的值来查找该项不是空的。如果应用程序没有自然的PK,那么您应该考虑将/ID作为分区键,并从屏幕截图中传递ID和分区键的值,看起来您的集合没有分区键。。您要为名称传递什么值?集合的分区键定义是什么?@AravindKrishnaR。这是我遇到的令人困惑的部分。对于您的第一个问题,我刚刚为名称传递了null。对于您的第二个问题,我不确定为什么我们需要分区键。我在想,如果我们需要通过其id获取项目,我们只需要它的id。这就是为什么我认为它只需要URL的id。为什么我们需要它的名称?@AravindKrishnaR。我还添加了上面分区键定义的屏幕截图。谢谢!在Cosmos DB中,主键是分区键和行键id的组合。这两个键的组合唯一地标识一行,而不仅仅是id。所以你需要若要在分区键中指定名称的值,以查找项不为空。如果应用程序没有自然PK,则应考虑将/ID作为分区键,并从屏幕截图中传递ID和分区键的值,看起来您的集合没有分区键。