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

标签 c# mongodb azure-cosmosdb

我在尝试更新嵌入文档列表中的属性时遇到问题。我尝试对其进行部分更新的属性是“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 接口(interface)的 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# 驱动程序。任何指向有用资源的指针或链接都将不胜感激。

最佳答案

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

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

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

MongoDB API support for MongoDB features and syntax

例如,摘自上面的文章:

数组更新操作符

$pull(注意:不支持带条件的$pull)

关于c# - 使用 MongoDB 和 C# 新驱动程序版本 (2.0) 更新嵌入式文档属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50469299/

相关文章:

c# - 为什么人们使用 ProjectData

java - 有没有办法更新 MongoDB 中的整个实体?

MongoDB $查找 : Limitations & Usage

azure - 必须使用 Task.Sleep 来防止 Cosmos DB 429 错误消息

azure - 构建管道中的 Azure CosmosDb 模拟器任务所需的 MongoDb 连接字符串是什么?

c# - 如何使用输出参数实现azure异步函数

c# - 自定义 ASP.NET MembershipProvider 有什么关系?

c# - Gridview 删除选中的行

c# - XML反序列化C#数组

node.js - mongoose.js 中的架构和子文档