Api cosmosdb的分区密钥

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

我正在使用ASP.NET内核和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将是

我的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和分区键的值,看起来您的集合没有分区键。