gpt4 book ai didi

c# - 如何使用 C# 更新 Azure CosmosDB 中的文档

转载 作者:行者123 更新时间:2023-12-02 07:09:13 24 4
gpt4 key购买 nike

我有一个从 Cosmos DB 加载文档的方法。该文档不是强类型的,并且不能强类型化。我想更新文档的各种属性,然后将该文档推送回 CosmosDB。

我遇到的问题是我想要更新的属性嵌套在另一个对象下,并且我找不到有关如何导航到此子属性并更新它的文档。

这是我目前正在尝试做的事情。

var project = await Service.GetById(projectId) as Microsoft.Azure.Documents.Document;

var gate = project.GetPropertyValue<dynamic>("IdeaInitiatedGate");
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalStatus", status);
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalComments", comments);
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalOn", DateTime.Now);
project.SetPropertyValue("IdeaInitiatedGate.Status", status == "Approved" ? "Completed" : "Rejected");
if (status == "Approved")
{
project.SetPropertyValue("CharterReview.Status", "Active");
}
var document = await Service.Replace(project);

服务只是实际 CosmosDB 调用的包装。上述代码所发生的情况是,正在文档根部名为“IdeaInitiatedGate.VpApprovalStatus”的文档中创建新属性。我想要发生的是将 IdeaInitiatedGate 的 VpApprovalStatus 属性更新为新值。

想要更新这个

{
"IdeaInitiatedGate": {
"VpApprovalStatus": "Approved"
}
}

不创建这个

{
"IdeaInitiatedGate.VpApprovalStatus": "Approved"
}

我最终得到的最终工作解决方案如下。基本上,我使用 GetPropertyValue 提取我想要的动态根对象,然后更改此对象和整个动态对象的 SetProperty 值。

if (!(await Service.GetById(projectId) is Document project)) return null;

var gate = project.GetPropertyValue<dynamic>("IdeaInitiatedGate");
gate.VpApprovalStatus = status;
gate.VpApprovalComments = comments;
gate.VpApprovalOn = DateTime.Now;
gate.Status = status == "Approved" ? "Completed" : "Rejected";
project.SetPropertyValue("IdeaInitiatedGate", gate);

if (status == "Approved")
{
var charterGate = project.GetPropertyValue<dynamic>("CharterReview");
charterGate.Status = "Active";
project.SetPropertyValue("CharterReview", charterGate);
}
var result = await Service.Replace(project);

最佳答案

我们可以使用 JObject 设置 IdeaInitiatedGate 属性

project?.SetPropertyValue("IdeaInitiatedGate", new JObject { { "VpApprovalStatus", status }});

如果您想为IdeaInitiatedGate添加多个属性。我们可以用下面的方式来做。

project?.SetPropertyValue("IdeaInitiatedGate", new JObject { { "VpApprovalStatus", "Approved" },{ "VpApprovalComments", comments},{ "VpApprovalOn", DateTime.Now }});

以下是演示代码。它在我这边工作正常。

var project = (Document)client.CreateDocumentQuery<dynamic>(UriFactory.CreateDocumentCollectionUri(databaseName, collectionName))
.AsEnumerable()
.First();
var gate = project?.GetPropertyValue<dynamic>("IdeaInitiatedGate");
project?.SetPropertyValue("IdeaInitiatedGate", new JObject { { "VpApprovalStatus", "Approved" }});
var document = client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(databaseName, collectionName, project?.Id), project).Result.Resource;

从 Azure 门户检查:

enter image description here

关于c# - 如何使用 C# 更新 Azure CosmosDB 中的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com