public UpdateDefinition <BsonDocument> BuildUpdatesForSave( UpdateDefinition <BsonDocument> update, TrackablePocoTracker <T> tracker, params object[] keyValues) { var keyNamespace = DocumentHelper.ToDotPathWithTrailer(keyValues); // mimic BsonClassMapSerializer.Serialize to serialize changed value correctly. // build bson elements containing set field values var setDocument = new BsonDocument(); var setBsonWriter = new BsonDocumentWriter(setDocument); var setContext = BsonSerializationContext.CreateRoot(setBsonWriter); setBsonWriter.WriteStartDocument(); foreach (var change in tracker.ChangeMap) { if (change.Value.NewValue != null) { BsonMemberMap memberMap; if (_propertyToMemberMap.TryGetValue(change.Key, out memberMap) == false) { continue; } setBsonWriter.WriteName(memberMap.ElementName); memberMap.GetSerializer().Serialize(setContext, change.Value.NewValue); } else { update = (update == null) ? Builders <BsonDocument> .Update.Unset(keyNamespace + change.Key.Name) : update.Unset(keyNamespace + change.Key.Name); } } setBsonWriter.WriteEndDocument(); setBsonWriter.Dispose(); foreach (var element in setDocument.Elements) { update = (update == null) ? Builders <BsonDocument> .Update.Set(keyNamespace + element.Name, element.Value) : update.Set(keyNamespace + element.Name, element.Value); } return(update); }