MongoDB C#驱动更新文档时如何忽略指定字段无需逐个声明Set属性
MongoDB C#驱动批量更新排除指定字段实现方案
你可以将请求对象转换为Bson文档后过滤要忽略的字段,再批量生成Set更新操作,无需手动逐个编写Set语句,适配2.12.*版本驱动,代码示例如下:
var filter = Builders<Employee>.Filter .Where(m => m.EmployeeId == request.EmployeeId); // 将request转换为Bson文档 var requestBson = request.ToBsonDocument(); // 移除仅插入时赋值的字段 requestBson.Remove(nameof(Employee.CreatedDateTime)); requestBson.Remove(nameof(Employee.CreatedBy)); // 统一设置更新时间 requestBson[nameof(Employee.LastUpdateDateTime)] = DateTime.UtcNow; // 批量生成Set更新定义 var updateList = new List<UpdateDefinition<Employee>>(); foreach (var bsonField in requestBson) { updateList.Add(Builders<Employee>.Update.Set(bsonField.Name, bsonField.Value)); } // 添加上插入时才生效的字段配置 updateList.Add(Builders<Employee>.Update.SetOnInsert(m => m.CreatedDateTime, DateTime.UtcNow)); updateList.Add(Builders<Employee>.Update.SetOnInsert(m => m.CreatedBy, request.CreatedBy)); // 合并所有更新操作 var finalUpdate = Builders<Employee>.Update.Combine(updateList); await _collection.UpdateOneAsync(filter, finalUpdate, new UpdateOptions { IsUpsert = true });
注意说明
- 该方案为部分更新,不会覆盖现有文档中未在request对象里定义的字段,符合绝大多数业务更新场景
- 如果你需要全量覆盖整个文档(即完全用request的结构替换现有文档,仅保留创建相关字段),可先查询获取现有文档的
CreatedDateTime、CreatedBy赋值到request后,调用ReplaceOneAsync方法执行替换,仅适合request包含文档所有字段的场景 - 你之前尝试的
Set(m => m, request)写法报错的原因是:MongoDB C#驱动不支持直接对根文档执行Set操作,该写法会被解析为给文档根路径赋值对象,和文档原有结构冲突,因此抛出序列化异常。
内容的提问来源于stack exchange,提问作者Abhishek Sharma
相关产品推荐
相关产品推荐

