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

时间:2019-09-24 16:10:16

标签: c# mongodb

我有一个带有settings字段的MongoDB文档,它本身带有两个嵌套字段selectedSectionIdssectionColorssettings不是数组。我只需要更新selectedSectionIds字段。

我的更新生成器如下:

  Builders<Account>.Update.Set(
    "settings.selectedSectionIds",
    sectionIds)

我打的是UpdateOneAsync,没什么特别的。

settings在原始文档中不存在或已经包含某些东西时,一切正常,但是当settings为null(并且可以)时,我得到以下MongoWriteException

  

写操作导致错误。     无法使用零件(settings.selectedSectionIds的设置)遍历元素({settings:null})

如何更新我的构建器(或类映射/序列化器?)以支持所有方案?

(MongoDB C#驱动程序2.8)

1 个答案:

答案 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();

        }
    }
}