MongoDB C # UpdateBuilder не игнорирует нули на множестве - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующие два класса, где пользователь устанавливает предпочтения. Пользователь может не иметь никаких предпочтений, только лайков, только антипатий или того и другого. В этом примере я уменьшил модель User для простоты.

[BsonIgnoreExtraElements]
public class User : Base
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [BsonIgnoreIfNull]
    public UserPreferences Preferences { get; set; }
}

[BsonIgnoreExtraElements]
public class UserPreferences
{
    [BsonIgnoreIfNull]
    public List<string> Likes { get; set; }
    [BsonIgnoreIfNull]
    public List<string> Dislikes { get; set; }
}

У меня есть вспомогательная функция, которая использует отражение для создания UpdateBuilder. Когда предоставляется объект пользователя, он устанавливает значение для ненулевых полей, поскольку я не хочу специально записывать, какие поля были обновлены при вызове. Однако вспомогательная функция не работает в моей текущей ситуации.

    public override User Update(User model)
    {

        var builder = Builders<User>.Update.Set(x => x.Id, model.Id);

        foreach(PropertyInfo prop in model.GetType().GetProperties())
        {
            var value = model.GetType().GetProperty(prop.Name).GetValue(model, null);

            if ((prop.Name != "Id") & (value != null))
            {
                builder = builder.Set(prop.Name, value);
            }
        }

        var filter = Builders<User>.Filter;
        var filter_def = filter.Eq(x => x.Id, model.Id);

        Connection.Update(filter_def, builder);

        return model;

    } 

Проблема: При указании Preferences только Likes или только Dislikes, другое свойство будет иметь значение null в MongoDB.

Желаемый результат: Я хочу, чтобы MongoDB игнорировал либо свойство Likes, либо Dislikes, если список пуст, как и для других свойств в моем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...