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

3
我有一个JSON模式,其结构如下:
父1对多个集合1对多个任务。
我有下面的代码,它接受一个更新的任务(updatedTask),并使用PatchItemAsync函数尝试在分区中更新特定文档(由文档ID设置)。然而,由于我正在更新JSON文档中的孙子项(即任务),因此我还尝试从父级到集合(通过传递set id)进行钻取,然后更新适当的任务(通过设置任务id)。结果我得到了一个对象未设置错误。
大多数示例都显示使用索引进行钻取,但我不知道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",

1
您能否提供一个带有实际结构的 JSON 文档样例,并指明您尝试进行修改的属性? - Mark Brown
Mark,感谢您的帮助。我已经提供了上面的模式以及有关Task的更多详细信息。 - Kuruption
1个回答

3
你可以像这样做,只需设置需要更新的项目的路径。
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) });

Sajeetharan - 谢谢。然而我的问题是,我不总是知道集合和任务的索引顺序。也许我需要解决的是如何查询文档,以便可以返回JSON文件中的索引,而不是尝试使用Set ID和Task ID? - Kuruption
1
使用 Patch 方法时,您需要知道索引。在您的情况下,您可以查询文档并进行替换,而不是使用 Patch 方法。 - Sajeetharan
1
谢谢。我只是查询并返回SET,这样我就可以获得SET和TASK的索引值,并像你上面提到的那样使用PathOperation.Set函数。 - Kuruption
如果任务不存在,会有什么行为? - Alex Gordon
@AlexGordon 补丁仅适用于现有文档。 - Sajeetharan
不知道节点是否存在,您有关于如何实现这个的任何建议吗? - Alex Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接