我有一个带有settings
字段的MongoDB文档,它本身带有两个嵌套字段selectedSectionIds
和sectionColors
。 settings
不是数组。我只需要更新selectedSectionIds
字段。
我的更新生成器如下:
Builders<Account>.Update.Set(
"settings.selectedSectionIds",
sectionIds)
我打的是UpdateOneAsync
,没什么特别的。
当settings
在原始文档中不存在或已经包含某些东西时,一切正常,但是当settings
为null(并且可以)时,我得到以下MongoWriteException
:
写操作导致错误。 无法使用零件(settings.selectedSectionIds的设置)遍历元素({settings:null})
如何更新我的构建器(或类映射/序列化器?)以支持所有方案?
(MongoDB C#驱动程序2.8)
答案 0 :(得分:0)
您无法更新null
的属性。如果它是一个空对象{}
,它将起作用。
所以我的建议是用2个步骤执行批量更新命令。在第一步中,您检查null并将其更改,然后在第二步中,根据需要设置子属性值。
下面是使用 MongoDB.Entities 的示例:
using MongoDB.Entities;
namespace StackOverflow
{
public class Program
{
public class Account : Entity
{
public string Name { get; set; }
public Settings Settings { get; set; }
}
public class Settings
{
public string[] SelectedSectionIDs { get; set; }
public string[] SectionColors { get; set; }
}
private static void Main(string[] args)
{
new DB("test", "127.0.0.1");
var acc1 = new Account
{
Name = "Account One",
Settings = new Settings
{
SectionColors = new[] { "green", "red" },
SelectedSectionIDs = new[] { "xxx", "yyy" }
}
}; acc1.Save();
var acc2 = new Account
{
Name = "Account Two",
Settings = null
}; acc2.Save();
DB.Update<Account>()
.Match(a => a.Settings == null)
.Modify(a => a.Settings, new Settings())
.AddToQueue()
.Match(_ => true)
.Modify(a => a.Settings.SelectedSectionIDs, new[] { "aaa", "bbb" })
.AddToQueue()
.Execute();
}
}
}