如何从Azure CosmosDB集合中检索单个文档

时间:2020-07-26 21:04:11

标签: c# .net .net-core azure-cosmosdb

我刚开始使用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"));

我在查询单个文档时出了什么问题?

2 个答案:

答案 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;