C#操作MongoDB向Offer子文档插入数据报Courses元素无效如何解决
错误原因
你调用UpdateOne方法时第二个参数直接传入了普通BsonDocument,不符合MongoDB C#驱动的方法要求:UpdateOne的第二个参数必须是UpdateDefinition类型的更新操作定义,驱动无法识别你直接传入的Courses字段对应的更新动作,因此抛出序列化异常。
解决方案
根据你的业务需求分两种场景处理:
场景1:向Courses数组中新增完整的Course子文档
使用Push操作将新构造的Course文档推入Courses数组,代码示例:
var builder1 = Builders<Dept_Entity>.Filter; var filter11 = builder1.Eq(x => x.DeptID, "IS"); // 构造要新增的Course文档 var newCourse = new BsonDocument { {"CourseID", txt_courseID.Text}, {"Title", txt_title.Text}, {"Level", Int32.Parse(txt_level.Text)}, {"Offer", new BsonArray { new BsonDocument { {"DeptID", txt_Year.Text}, // 注意这里你赋值用的是txt_Year,和外层筛选的DeptID=IS逻辑不符,确认是否手误 {"CourseID", txt_courseID.Text}, {"Year", txt_Year.Text}, {"AvailablePlaces", txt_availableplaces.Text}, {"ClassSize", txt_classszie.Text} // 注意拼写疑似错误,应为classsize } } } }; // 构造更新定义:将newCourse推入Courses数组 var update = Builders<Dept_Entity>.Update.Push(x => x.Courses, newCourse); collection1.UpdateOne(filter11, update);
场景2:向已存在的指定Course的Offer数组新增子文档
如果对应CourseID的课程已经存在,仅需要追加Offer条目,使用数组定位符实现:
var builder1 = Builders<Dept_Entity>.Filter; // 筛选条件:DeptID=IS,且Courses数组中存在对应CourseID的条目 var filter11 = builder1.And( builder1.Eq(x => x.DeptID, "IS"), builder1.ElemMatch(x => x.Courses, c => c.CourseID == txt_courseID.Text) ); // 构造要新增的Offer子文档 var newOffer = new BsonDocument { {"DeptID", txt_Year.Text}, {"CourseID", txt_courseID.Text}, {"Year", txt_Year.Text}, {"AvailablePlaces", txt_availableplaces.Text}, {"ClassSize", txt_classszie.Text} }; // 构造更新定义:向匹配到的Course的Offer数组追加新条目 var update = Builders<Dept_Entity>.Update.Push("Courses.$.Offer", newOffer); collection1.UpdateOne(filter11, update);
内容的提问来源于stack exchange,提问作者user3246945
相关产品推荐
相关产品推荐

