如何使用C#驱动对Mongodb执行批量多文档更新操作
C# MongoDB 多文档按Id批量更新不生效解决方案
现有写法的问题
- 过滤器参数错误:
Builders<T>.Filter.In("Id", List<T>)的第二个入参要求是Id值的集合,你传入完整的List<T>对象集合无法匹配到任何文档,是更新无响应的核心原因。 - 更新逻辑不符合需求:你当前写的
Set语句会把所有匹配到的文档的目标字段统一设置为整个List<T>集合,仅适用于所有匹配文档更新为相同值的场景,无法实现每个Id对应更新自身属性的需求。
正确实现方案
场景1:每个文档按Id对应更新自身不同属性(XML解析更新场景适用)
使用MongoDB官方提供的BulkWriteAsync批量操作接口实现,示例代码如下:
// 待更新的XML解析结果列表,替换为你自己的变量 List<T> xmlParsedList = 你的XML解析结果; // 构造批量操作集合 var bulkOperations = new List<WriteModel<T>>(); foreach (var item in xmlParsedList) { // 按Id匹配单条文档 var filter = Builders<T>.Filter.Eq("Id", item.Id); // 配置需要更新的字段,有多个字段可以链式调用Set方法 var update = Builders<T>.Update .Set("目标字段1", item.字段1) .Set("目标字段2", item.字段2); // 将单条更新操作加入批量集合,IsUpsert设为true时如果Id不存在会插入新文档,不需要可以改为false bulkOperations.Add(new UpdateOneModel<T>(filter, update) { IsUpsert = false }); } // 执行批量操作 await 你的MongoCollection实例.BulkWriteAsync(bulkOperations);
场景2:所有匹配Id的文档更新为同一个固定值
这种场景可以直接用UpdateManyAsync,正确写法如下:
// 先提取所有待更新的Id集合 var idList = xmlParsedList.Select(x => x.Id).ToList(); var filter = Builders<T>.Filter.In("Id", idList); // 所有匹配文档的目标字段都更新为同一个固定值 var update = Builders<T>.Update.Set("目标字段名", 要设置的固定值); await 你的MongoCollection实例.UpdateManyAsync(filter, update);
内容的提问来源于stack exchange,提问作者Nevega
相关产品推荐
相关产品推荐

