C# Cosmos DB ReadItemAsync 分区键多个值
C# Cosmos DB ReadItemAsync Partition Key multiple values
我有一个容器,其分区键由两个字段组成。他们都不是'id'。在此示例中,它是 FormId 和版本。
我正在调用一个函数,该函数使用 ReadItemAsync return 容器中的单个文档。我想包含 Partition Key 参数,因为容器中的数据设置得非常大,我不想让查询 运行 仅基于 id 值进行跨分区。但是,当我进行调用时,我不知道如何构造分区键值。
public async Task<dynamic> GetItemAsync(string id, string? partitionId, string containerName)
{
try
{
Container container = _client.GetContainer(_databaseName, containerName);
ItemResponse<dynamic> response;
if (partitionId == null)
response = await container.ReadItemAsync<dynamic>(id, PartitionKey.None);
else
response = await container.ReadItemAsync<dynamic>(id, new PartitionKey(partitionId));
return response.Resource;
}
catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
return null;
}
}
当我调用带有 id Guid 和 null 作为分区键的函数时,该函数工作正常。当我以下列任何方式传入表示分区键的字符串时,我找不到任何数据:
formId + "." + version
formId + "/" + version
formId + "\" + version
partition key参数由多个字段组成时应该如何构造?
编辑 1:文档实例示例:
{
"formID": "e8493c8b-6736-4360-b781-5d94e93fe545",
"version": "1",
"id": "71d7458d-b71c-467e-b5b9-2b646dbd5435",
"_rid": "QMgvAKsrCcABAAAAAAAAAA==",
"_self": "dbs/QMgvAA==/colls/QMgvAKsrCcA=/docs/QMgvAKsrCcABAAAAAAAAAA==/",
"_etag": "\"5f019a17-0000-1100-0000-6205202f0000\"",
"_attachments": "attachments/",
"_ts": 1644503087
}
分区键设置为\formId.version。
根据评论和新信息,问题出在属性名称的大小写上。
/formId.version
作为分区键定义意味着您的文档应具有以下格式:
{
"formId": {
"version": "some value"
},
"id": "the id"
}
“点”表示formId
实际上是一个对象,里面应该有一个version
属性.
要阅读这样的文档,您会这样做:
container.ReadItem<dynamic>("the id", new PartitionKey("some value"))
您提供的文档示例有formID
,这意味着它确实没有分区键值。此外,另一个问题是,即使大小写匹配,您使用的是字符串值,而不是带有 version
属性.
的嵌套 JSON 对象
您似乎需要 /formID
作为分区键定义以适合您共享的代码和文档。
我有一个容器,其分区键由两个字段组成。他们都不是'id'。在此示例中,它是 FormId 和版本。
我正在调用一个函数,该函数使用 ReadItemAsync return 容器中的单个文档。我想包含 Partition Key 参数,因为容器中的数据设置得非常大,我不想让查询 运行 仅基于 id 值进行跨分区。但是,当我进行调用时,我不知道如何构造分区键值。
public async Task<dynamic> GetItemAsync(string id, string? partitionId, string containerName)
{
try
{
Container container = _client.GetContainer(_databaseName, containerName);
ItemResponse<dynamic> response;
if (partitionId == null)
response = await container.ReadItemAsync<dynamic>(id, PartitionKey.None);
else
response = await container.ReadItemAsync<dynamic>(id, new PartitionKey(partitionId));
return response.Resource;
}
catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
return null;
}
}
当我调用带有 id Guid 和 null 作为分区键的函数时,该函数工作正常。当我以下列任何方式传入表示分区键的字符串时,我找不到任何数据:
formId + "." + version
formId + "/" + version
formId + "\" + version
partition key参数由多个字段组成时应该如何构造?
编辑 1:文档实例示例:
{
"formID": "e8493c8b-6736-4360-b781-5d94e93fe545",
"version": "1",
"id": "71d7458d-b71c-467e-b5b9-2b646dbd5435",
"_rid": "QMgvAKsrCcABAAAAAAAAAA==",
"_self": "dbs/QMgvAA==/colls/QMgvAKsrCcA=/docs/QMgvAKsrCcABAAAAAAAAAA==/",
"_etag": "\"5f019a17-0000-1100-0000-6205202f0000\"",
"_attachments": "attachments/",
"_ts": 1644503087
}
分区键设置为\formId.version。
根据评论和新信息,问题出在属性名称的大小写上。
/formId.version
作为分区键定义意味着您的文档应具有以下格式:
{
"formId": {
"version": "some value"
},
"id": "the id"
}
“点”表示formId
实际上是一个对象,里面应该有一个version
属性.
要阅读这样的文档,您会这样做:
container.ReadItem<dynamic>("the id", new PartitionKey("some value"))
您提供的文档示例有formID
,这意味着它确实没有分区键值。此外,另一个问题是,即使大小写匹配,您使用的是字符串值,而不是带有 version
属性.
您似乎需要 /formID
作为分区键定义以适合您共享的代码和文档。