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

时间:2018-05-22 13:44:21

标签: c# mongodb azure-cosmosdb

我在尝试更新嵌入文档列表中的属性时遇到问题。我试图进行部分更新的属性是" SelectedDecision"在" CaseTaskDecision"类。

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);
}

值得关注的是&#34; Set&#34;上面代码中的陈述。我不知道如何引用正确的属性来进行嵌入式文档的部分更新。

我是使用MongoDB的新手,这是第一次使用C#驱动程序。任何有用资源的指针或链接都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

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

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

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

MongoDB API support for MongoDB features and syntax

例如,取自上面的文章:

数组更新运算符

$ pull(注意:不支持$ pull with condition)