使用MongoDB和C#新驱动程序版本(2.0)更新嵌入式文档属性
我在尝试更新嵌入文档列表中的属性时遇到问题。我试图对其进行部分更新的属性是“CaseTaskDecision”类中的“SelectedDecision” 我正在使用带有MongoDB接口的Azure DocumentDB后端。用于尝试和更新属性的C#代码为:使用MongoDB和C#新驱动程序版本(2.0)更新嵌入式文档属性,c#,mongodb,azure-cosmosdb,C#,Mongodb,Azure Cosmosdb,我在尝试更新嵌入文档列表中的属性时遇到问题。我试图对其进行部分更新的属性是“CaseTaskDecision”类中的“SelectedDecision” 我正在使用带有MongoDB接口的Azure DocumentDB后端。用于尝试和更新属性的C#代码为: public async Task<UpdateResult> UpdateTaskDecision(string id, string taskId, string selectedDecision) { var u
public async Task<UpdateResult> UpdateTaskDecision(string id, string taskId, string selectedDecision)
{
var update = Builders<CaseAPI.Models.Case>.Update.Set("casetasks.$.castTaskDecision.selectedDecision", selectedDecision);
return await _db.GetCollection<CaseAPI.Models.Case>(_collection).UpdateOneAsync<CaseAPI.Models.Case>(o => o.Id.Equals(id) && o.CaseTasks.Any(t => t.Id.Equals(taskId)), update);
}
公共异步任务UpdateTaskDecision(字符串id、字符串taskId、字符串selectedDecision)
{
var update=Builders.update.Set(“casetasks.$.castTaskDecision.selectedDecision”,selectedDecision);
返回wait _db.GetCollection(_collection).UpdateOneAsync(o=>o.Id.Equals(Id)&&o.CaseTasks.Any(t=>t.Id.Equals(taskId)),update);
}
关注点是上述代码中的“Set”语句。我不知道如何引用正确的属性来对嵌入文档进行部分更新
我对使用MongoDB非常陌生,这是第一次使用C#驱动程序。任何指向有用资源的指针或链接都将不胜感激 不幸的是,在撰写本文时,Azure Cosmos DB不支持更新MongoDB中嵌入式阵列中的单个项。我们最初使用的是Cosmos,最近由于缺乏对MongoDB的功能支持,我们已经过渡到MongoDB Atlas 要使用Cosmos实现您想要的功能,您需要获取整个数组,更新所需的项(在代码中),并替换文档的整个数组属性—效率非常低 值得检查一下Cosmos支持什么和不支持什么,因为它不喜欢某些操作,主要是更新嵌入式数组中的项,即PullFilter 例如,摘自上述文章: 数组更新运算符
$pull(注意:$pull with condition不受支持)目前我正在使用解决方案更新整个嵌入文档。更新嵌入文档中属性的功能目前正在开发中。
{
"_id" : ObjectId("5aff22845d02052ea80f7717"),
"casetasks" : [
{
"_id" : ObjectId("000000000000000000000000"),
"caseTaskDecision" : {
"_id" : ObjectId("000000000000000000000000"),
"selectedDecision" : null
}
}
]
}
public async Task<UpdateResult> UpdateTaskDecision(string id, string taskId, string selectedDecision)
{
var update = Builders<CaseAPI.Models.Case>.Update.Set("casetasks.$.castTaskDecision.selectedDecision", selectedDecision);
return await _db.GetCollection<CaseAPI.Models.Case>(_collection).UpdateOneAsync<CaseAPI.Models.Case>(o => o.Id.Equals(id) && o.CaseTasks.Any(t => t.Id.Equals(taskId)), update);
}