我有像下面这样的 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 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}");
}
然后您将能够成功运行代码,不会出现任何错误,如下所示:
以下是完整代码供您参考:
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}");
}
}
}