C# 在Mongo DB中,如何更新可以为null的属性的嵌套属性

C# 在Mongo DB中,如何更新可以为null的属性的嵌套属性,c#,mongodb,C#,Mongodb,我有一个MongoDB文档,其中有一个设置字段,它本身有两个嵌套字段,SelectedSectionID和SectionColor设置不是数组。我只需要更新selectedSectionIds字段 我的更新生成器如下所示: Builders<Account>.Update.Set( "settings.selectedSectionIds", sectionIds) Builders.Update.Set( “设置。SelectedSectionID”, 部分I

我有一个MongoDB文档,其中有一个
设置
字段,它本身有两个嵌套字段,
SelectedSectionID
SectionColor
<代码>设置不是数组。我只需要更新
selectedSectionIds
字段

我的更新生成器如下所示:

  Builders<Account>.Update.Set(
    "settings.selectedSectionIds",
    sectionIds)
Builders.Update.Set(
“设置。SelectedSectionID”,
部分ID)
我正在调用
UpdateOneAsync
,没有什么特别的

settings
未出现在原始文档中或已包含某些内容时,所有设置都可以正常工作,但当
settings
为null(并且可以为null)时,我会得到以下
MongoWriteException

写入操作导致错误。 无法使用部分(settings.selectedSectionId的设置)遍历元素({settings:null})

如何更新生成器(或类映射/序列化器?)以支持所有场景


(MongoDB C#drivers 2.8)

不能更新
null的属性。如果它是一个空对象
{}
,它就会工作。 因此,我的建议是通过两个步骤执行批量更新命令。在第一步中,检查并更改空值,在第二步中,根据需要设置子属性值

以下是一个使用MongoDB.Entities的示例,以简洁起见:

使用MongoDB.Entities;
命名空间堆栈溢出
{
公共课程
{
公共类帐户:实体
{
公共字符串名称{get;set;}
公共设置{get;set;}
}
公共类设置
{
公共字符串[]SelectedSectionId{get;set;}
公共字符串[]SectionColors{get;set;}
}
私有静态void Main(字符串[]args)
{
新DB(“测试”,“127.0.0.1”);
var acc1=新账户
{
Name=“账户一”,
设置=新设置
{
SectionColors=new[]{“绿色”、“红色”},
SelectedSectionIDs=new[]{“xxx”,“yyy”}
}
};acc1.Save();
var acc2=新账户
{
Name=“账户二”,
设置=空
};acc2.Save();
DB.Update()
.Match(a=>a.Settings==null)
.Modify(a=>a.Settings,newsettings())
.AddToQueue()
.Match(=>true)
.Modify(a=>a.Settings.selectedSectionId,新[]{“aaa”,“bbb”})
.AddToQueue()
.Execute();
}
}
}

您不能更新
null的属性。如果它是一个空对象
{}
,它就会工作。 因此,我的建议是通过两个步骤执行批量更新命令。在第一步中,检查并更改空值,在第二步中,根据需要设置子属性值

以下是一个使用MongoDB.Entities的示例,以简洁起见:

使用MongoDB.Entities;
命名空间堆栈溢出
{
公共课程
{
公共类帐户:实体
{
公共字符串名称{get;set;}
公共设置{get;set;}
}
公共类设置
{
公共字符串[]SelectedSectionId{get;set;}
公共字符串[]SectionColors{get;set;}
}
私有静态void Main(字符串[]args)
{
新DB(“测试”,“127.0.0.1”);
var acc1=新账户
{
Name=“账户一”,
设置=新设置
{
SectionColors=new[]{“绿色”、“红色”},
SelectedSectionIDs=new[]{“xxx”,“yyy”}
}
};acc1.Save();
var acc2=新账户
{
Name=“账户二”,
设置=空
};acc2.Save();
DB.Update()
.Match(a=>a.Settings==null)
.Modify(a=>a.Settings,newsettings())
.AddToQueue()
.Match(=>true)
.Modify(a=>a.Settings.selectedSectionId,新[]{“aaa”,“bbb”})
.AddToQueue()
.Execute();
}
}
}