Ошибка обновления документа драйвера Mongodb c sharp

#c# #mongodb #mongodb-query #mongodb-.net-driver #mongodb-csharp-2.0

#c# #mongodb #mongodb-запрос #mongodb-.net-driver #mongodb-csharp-2.0

Вопрос:

Я использую драйвер c # mongo db для вставки и обновления документа. Сначала я вставляю запись, а затем пытаюсь обновить определенное поле записи, используя метод FindOneAndUpdateAsync. Я могу обновить его должным образом, но после обновления я получаю сообщение об ошибке «Отсутствует требуемый элемент ‘Name’ для свойства’Name’ класса SampleApp.Person». Я использую MongoCommunity версии 4.4.1, а драйвер mongo — 2.11.4.

Я прилагаю изображение mongo compass view для вашей справки.Вид компаса

Моя структура коллекции

 [BsonSerializer(typeof(ImpliedImplementationInterfaceSerializer<IPerson, Person>))]
public interface IPerson
{
    string Id { get; set; }
    string Name { get; set; }
    int Age { get; set; }
    string Email { get; set; }
    IAddress Address { get; set; }
    bool IsActive { get; set; }
}

public class Person : IPerson
{
    [BsonId]
    public string Id { get; set; }

    [BsonRequired]
    
    public string Name { get; set; }

    [BsonRequired]
    public int Age { get; set; }
    public string Email { get; set; }
    public IAddress Address { get; set; }

    [BsonRequired]
    public bool IsActive { get; set; }
}

public interface IAddress
{
    string Line1 { get; set; }
    string Line2 { get; set; }
    string Line3 { get; set; }
    string City { get; set; }
    string State { get; set; }
    string Pincode { get; set; }
}

public class Address : IAddress
{
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string Line3 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Pincode { get; set; }
}
  

Мой код для вставки и обновления выглядит так, как показано ниже.

 MongoClient client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("test");
BsonClassMap.RegisterClassMap<Address>();
var peopleCollection = database.GetCollection<IPerson>("People");
IPerson person = new Person()
{
    Age = 50,
    Email = "a@a.com",
    IsActive = false,
    Name = "David",
    Id = ObjectId.GenerateNewId().ToString()
};
try
{
    await peopleCollection.InsertOneAsync(person);
    IAddress address = new Address()
    {
        City = "Bengaluru",
        Line1 = "Bengaluru",
        Line2 = "Bengaluru",
        Line3 = "Bengaluru",
        Pincode = "560001",
        State = "KA"
    };

    var updateDefinition = Builders<IPerson>.Update.Set(x => x.Address, address).Set(x => 
    x.IsActive, true);
    var filter = Builders<IPerson>.Filter.Eq(x => x.Email, "a@a.com");
    FindOneAndUpdateOptions<IPerson> updateOptions = new FindOneAndUpdateOptions<IPerson>
    {
        IsUpsert = false,
        ReturnDocument = ReturnDocument.After,
        Projection = Builders<IPerson>.Projection.Include(c => c.Address)
    };
    IPerson updatedPerson = await peopleCollection.FindOneAndUpdateAsync(filter, updateDefinition, updateOptions);

    }
    catch (Exception ex)
    {
       string s = ex.Message;
       Console.WriteLine(s);
    }
  

Комментарии:

1. Свойства в классах должны быть общедоступными, чтобы сериализация работала.

2. Вы пробовали удалить [BsonRequired] и посмотреть, что вы получите в ответ? Ошибка говорит о том, что независимо от того, какое значение извлекается, в нем отсутствует Name свойство.

Ответ №1:

Я предполагаю, что значение pre-update вообще не имеет свойства Name, поэтому, когда FindOneAndUpdateAsync он получает данные и пытается десериализовать их (перед обновлением), он завершается ошибкой с этой ошибкой.

Два решения для этого

  1. Попробуйте удалить [BsonRequired] , чтобы избежать этой ошибки.
  2. Попробуйте обновить все документы в экземпляре MongoDB, чтобы иметь Name свойство, перед запуском вашего кода.

Комментарии:

1. Удаление [BsonRequired] удалит эту ошибку. Мне любопытно узнать, обязательно ли указывать все обязательные поля во время обновления.

2. Я думаю, что этого не должно быть. Однако уже существующий документ в MongoBD должен иметь все необходимые свойства, прежде чем вы сможете его найти и обновить.

3. Не забудьте принять / проголосовать за ответы, если они покажутся вам полезными.

4. Конечно. Спасибо за быстрый ответ