我刚开始使用cosmosdb刮擦表面,但是在查询文档时遇到了问题。 我的文档如下:
{
"id": "2",
"url": "cars/toyota-auris",
"name": "Toyota Auris",
"description": "Auris desc",
"address": {
"city": "Berlin"
},
"_rid": "--4zAKfcoCgCAAAAAAAAAA==",
"_self": "dbs/--2zAA==/colls/--4zAKfcoCg=/docs/--4zAKfcoCgCAAAAAAAAAA==/",
"_etag": "\"23010db4-0000-0d00-0000-5f1b5f4a0000\"",
"_attachments": "attachments/",
"_ts": 1595629383
}
Partition key: address/city
我正在尝试使用cosmosd .net sdk 3检索文档。
int id = "2";
ItemResponse<Car> response = await _container.ReadItemAsync<Car>(id, new PartitionKey(id));
return response.Resource;
此查询最终出现异常:
Microsoft.Azure.Cosmos.CosmosException: 'Response status code does not indicate success: NotFound (404); Substatus: 0; ActivityId: c2c2bbff-5451-44af-a397-ca67088cce02; Reason: ({
"Errors": [
"Resource Not Found"
]
});'
有趣的是,我能够使用以下命令查询所有文档
_container.GetItemQueryIterator<Car>(new QueryDefinition("SELECT * FROM Cars"));
我在查询单个文档时出了什么问题?
答案 0 :(得分:1)
看起来您正在使用id
作为分区键进行查询,但是您定义的分区键是address/city
。由于ReadItemAsync仅查找指定的分区,因此找不到您的项目。如果要进行点读取,则需要选择一个事先知道的分区键。
答案 1 :(得分:1)
如上所述,您需要传递正确的分区键值。像这样重写ReadItemAsync()。
int id = "2";
string pk = "Berlin";
ItemResponse<Car> response = await _container.ReadItemAsync<Car>(id, new PartitionKey(pk));
return response.Resource;