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