我可以在 Azure Cosmos DB 中使用路径(/user/firstName)设置分区键吗

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

我有像下面这样的 JSON

{
  "user": {
    "firstName": "FirstName"
  },
  "attr1": "abcd",
  "attr2": "efgh"
}

我想使用firstName作为我的Cosmos容器的分区键。我使用分区键创建了容器 "/user/firstName".

但是当我使用此分区键读取时,出现 Cosmos 未找到异常。

下面是我用来阅读的代码:

var firstName = "FirstName"
User user= await _container.ReadItemAsync<User>(firstName, new PartitionKey(firstName));
azure azure-cosmosdb cosmos
1个回答
0
投票

enter image description here

在 Azure Cosmos DB 中,当您使用

ReadItemAsync
方法时,必须同时提供
id
和分区键,您已经提到只有分区键可能是获得“NotFound”异常的原因,如图所示多于。要解决将 id 属性添加到代码中的错误,在创建每个项目时将为每个项目生成一个唯一的 id,如下所示:

{
    "user": {
        "firstName": "FirstName"
    },
    "attr1": "abcd",
    "attr2": "efgh",
    "id": "****",
    "_rid": "****",
    "_self": "*****",
    "_etag": "*****"",
    "_attachments": "attachments/",
    "_ts": ****
}

在代码中使用唯一的 id 值,如下所示:

var id = "<id>"; 
var firstName = "FirstName"; 
PartitionKey partitionKey = new PartitionKey(firstName); 
try  
{  
    User user = await container.ReadItemAsync<User>(id, partitionKey);  
    Console.WriteLine($"User found: {user.user.firstName}");
}

然后您将能够成功运行代码,不会出现任何错误,如下所示:

enter image description here

以下是完整代码供您参考:

using Microsoft.Azure.Cosmos;
using System;
using System.Threading.Tasks;
 
class Program
{
    private static readonly string EndpointUri = "<cosmosURI>";
    private static readonly string PrimaryKey = <primaryKey>"; 
    private static CosmosClient cosmosClient;
    private static Container container;
 
    static async Task Main(string[] args)
    {
        cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        container = cosmosClient.GetContainer("db", "c1");
 
        // Use the correct id of the item you want to read
        var id = "<id>"; 
        var firstName = "FirstName"; 
        PartitionKey partitionKey = new PartitionKey(firstName);  
        try
        {
            User user = await container.ReadItemAsync<User>(id, partitionKey);
            Console.WriteLine($"User found: {user.user.firstName}");       
        }
        catch (CosmosException ex)
        {
            Console.WriteLine($"Cosmos DB Exception: {ex.Message}");
            Console.WriteLine($"Status Code: {ex.StatusCode}");
            Console.WriteLine($"Stack Trace: {ex.StackTrace}");
        }
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.