为了账号安全,请及时绑定邮箱和手机立即绑定

使用 MongoDB 和 C# 新驱动程序版本 (2.0) 更新嵌入式文档属性

使用 MongoDB 和 C# 新驱动程序版本 (2.0) 更新嵌入式文档属性

C#
蝴蝶不菲 2021-06-21 16:14:19
我在尝试更新嵌入文档列表中的属性时遇到问题。我试图对其进行部分更新的属性是“CaseTaskDecision”类中的“SelectedDecision”。public class Case{    [BsonId]    public ObjectId InternalId { get; set; }    [BsonElement(elementName: "casetasks")]    public List<CaseTask> CaseTasks { get; set; }}public class CaseTask{    [BsonId]    public ObjectId InternalId { get; set; }    [BsonElement(elementName: "caseTaskDecision")]    public CaseTaskDecision CaseTaskDecision { get; set; }}public class CaseTaskDecision{    [BsonId]    public ObjectId InternalId { get; set; }    [BsonElement(elementName: "selectedDecision")]    public string SelectedDecision { get; set; }}下面是 mongodb 文档的一个例子{    "_id" : ObjectId("5aff22845d02052ea80f7717"),    "casetasks" : [        {            "_id" : ObjectId("000000000000000000000000"),            "caseTaskDecision" : {                "_id" : ObjectId("000000000000000000000000"),                "selectedDecision" : null            }        }    ]}我正在使用带有 MongoDB 接口的 Azure DocumentDB 后端。用于尝试更新属性的 C# 代码是: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);}关注点是上面代码中的“Set”语句。我不确定如何引用正确的属性来对嵌入的文档进行部分更新。我对使用 MongoDB 非常陌生,这是第一次使用 C# 驱动程序。任何指向有用资源的指针或链接将不胜感激。
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

遗憾的是,在撰写本文时,Azure Cosmos DB支持更新 MongoDB 中嵌入式数组中的单个项目。我们最初使用 Cosmos,由于缺乏对 MongoDB 的功能支持,我们最近过渡到了 MongoDB Atlas。

要使用 Cosmos 实现您想要的功能,您需要获取整个数组,更新您想要的项目(在代码中)并替换文档的整个数组属性 - 效率很低。

值得检查一下 Cosmos 支持和不支持的内容,因为有一些它不喜欢的操作,主要是围绕更新嵌入式数组中的项目,即 PullFilter



查看完整回答
反对 回复 2021-06-26
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信