using System; using System.Collections.Generic; using System.Linq; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; namespace Mongo.Test { public class Person { public string Name { get; set; } public char Gender { get; set; } public override string ToString() => $@"{GetType().Name}: ({Gender}) {Name}"; } public class Group { public ObjectId Id { get; set; } = new ObjectId(); public string Name { get; set; } public List Members { get; set; } public override string ToString() => $@"{GetType().Name}: {Id}, Name: {Name}, Members: [{string.Join(", ", Members)}]"; } class Program { static void Main() { var mongoUrl = MongoUrl.Create(@"mongodb://localhost:30000/test"); var client = new MongoClient(mongoUrl); client.DropDatabase(mongoUrl.DatabaseName); var database = client.GetDatabase(mongoUrl.DatabaseName); var collection = database.GetCollection(nameof(Group)); var group = new Group { Name = "Class A1", Members = new List { new Person { Name ="Lea", Gender = 'F' } } }; collection.InsertOne(group); var result = collection.Find(g => g.Members.Any(p => p.Gender == 'F')).FirstOrDefault(); Console.WriteLine(result); // #1: Document added perfectly group.Members.AddRange(new List { new Person { Name ="Linus", Gender = 'M' }, new Person { Name ="Julius", Gender = 'M' } }); UpdateMemebrs(collection, group.Id, group.Members); // #2: Document updated perfectly group.Members.Add(new Person { Name = "Martin", Gender = 'M' }); // #3.1: Updating members using reflection to get property value... var propertyInfo = typeof(Group).GetProperty("Members"); UpdateMemebrs(collection, group.Id, propertyInfo.GetValue(group)); // NOTE: the "Members" field is actually of type List but we are parsing // #3.2: ...will "change" the document so find does not work UpdateMemebrs(collection, group.Id, group.Members.ToArray()); // #2: Document updated perfectly Console.ReadLine(); } private static void UpdateMemebrs(IMongoCollection collection, ObjectId groupId, TProp members) { var filter = Builders.Filter.Eq(p => p.Id, groupId); var update = Builders.Update.Set(nameof(Group.Members), members); Console.WriteLine(update.Render(BsonSerializer.LookupSerializer(), BsonSerializer.SerializerRegistry)); collection.UpdateOne(filter, update); // Now, test that the update was good var result = collection.Find(g => g.Members.Any(p => p.Gender == 'F')).FirstOrDefault(); Console.WriteLine(result?.ToString() ?? "Not Found"); } } }