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 作为分区键定义以适合您共享的代码和文档。