MongoDB.live, free & fully virtual. Register Now MongoDB.live, free & fully virtual. Register Now

C# mongoDb error updating a document

Hi,

I am using c# mongo db driver to insert and update a document. First i insert a record and then I try to update a specific field of record using FindOneAndUpdateAsync method. I am able to update it properly but after update I am getting a error “Required element ‘Name’ for property ‘Name’ of class SampleApp.Person is missing.” I am using MongoCommunity edition 4.4.1 and mongo driver is 2.11.4.

My collection structure is

[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; }
    }

My code to insert and update is as shown below.

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);
            }

I am attaching mongo compass view for your reference.