Azure Cosmos DB 部分更新和补丁操作替换路径

Azure Cosmos DB Partial Update and Patch Operation Replace Path

我有一个 JSON 架构,其结构如下:

PARENT 1 到多个 SET 1 到多个任务。

我有下面的代码接受更新任务 (updatedTask) 并使用 PatchItemAsync 函数尝试更新分区内的特定文档(由文档 ID 设置)(与 partitionKey 一样)。但是,由于我正在更新我的 JSON 文档中的孙项目(即任务),我还试图从 parent 向下钻取以设置(通过传递设置 ID),然后更新适当的任务(通过设置任务 ID)。结果我得到了 object not set 错误。

大多数示例显示使用索引向下钻取,但我不知道 SET 和 TASK 的顺序在哪里,但确实有它们的 ID。

关于我应该如何设置路径以便用新任务值替换当前任务有什么想法吗?感谢您的帮助和指导。

    public async Task<string> UpdateIT(string docid, Task updatedTask, string path, string taskid, string setid)
    {
           try
        {
            PatchItemRequestOptions patchItemRequestOptions = new PatchItemRequestOptions
            {
                FilterPredicate = path
            };
            ItemResponse<IndividualTask> response = await container.PatchItemAsync<IndividualTask>
                (id: docID, partitionKey: new Microsoft.Azure.Cosmos.PartitionKey(taskid), patchOperations: new[] { PatchOperation.Replace("/PARENT/SET/[?(@.SETID=='" + setid + "')]/TASK/[?(@. TASKID=='" + taskid + "'")], updatedIT) }, patchItemRequestOptions);
            string status = response.StatusCode.ToString();
            return status;
        }
        catch (Exception e)
        {
            return e.Message;
        }
}

我还提供了 JSON 架构。我正在尝试更新任务中的所有属性(即 TaskID、TaskStatus、TaskTitle 等)。

{
"PARENT": [
    {
        "_type": null,
        "PARENTID": "GUID",
        "PARENTTitle": null,
        "PARENTDescription": null,
        "SET": [
            {
                "SETID": "GUID",
                "CreatedBy": "",
                "CreatedDate": "0001-01-01T00:00:00",
                "TASK": [
                    {
                        "TASKID": "GUID",
                        "TaskStatus": "",
                        "TaskTitle": "",
                        "TaskType": "",
                        "TaskDescription": "",
                        "TaskNotes": "",
                        "Priority": "Normal",
                        "CreatedBy": "",
                        "CreatedDate": "0001-01-01T00:00:00"
                    }
                ]
            }
        ]
    }
],
"CaseID": "GUID",
"TenantID": "testtenant0004",
"id": "GUID",
"TaskID": "GUID",

你也可以这样做,设置你需要更新的项目的路径即可

Task test = new();
test.Description = "test description 01";
test.Id = "00123";    
ItemResponse<SalesOrder> response = await 
container.PatchItemAsync<SalesOrder>(
    id: docID,
    partitionKey: new PartitionKey("partitionkey-value"),
    patchOperations: new[] { PatchOperation.Set("/PARENT/0/SET/0/TASK/0", test) });