C#操作MongoDB批量Upsert时报无法确定o=>o的序列化信息错误
错误原因
你代码中使用 Builders<Order>.Update.Set(o => o, order) 尝试直接更新整个根文档的写法不符合MongoDB C#驱动的表达式解析规则,驱动无法识别指向文档根对象的lambda表达式对应的序列化配置,因此抛出"Unable to determine the serialization information for o => o"错误。
解决方案
全量替换匹配文档的场景下,直接使用ReplaceOneModel替代UpdateOneModel即可,这是MongoDB驱动提供的专门用于整文档替换的操作类,天然支持全量Upsert场景。
修改后的代码如下:
public async Task SyncAsync(List<Order> orders) { var bulkUpdateModel = new List<WriteModel<Order>>(); foreach (var order in orders) { var filter = Builders<Order>.Filter.Eq(o => o.Id, order.Id); // 用ReplaceOneModel整文档替换替代UpdateOneModel var upsertOne = new ReplaceOneModel<Order>(filter, order) { IsUpsert = true }; bulkUpdateModel.Add(upsertOne); } await _orders.BulkWriteAsync(bulkUpdateModel); }
补充说明
如果后续你只需要更新文档的部分字段,而非全量替换,再使用Update.Set逐个指定需要更新的字段即可,例如:
var updateDefinition = Builders<Order>.Update.Set(o => o.Number, order.Number);
这种指定具体字段的lambda表达式是可以被驱动正常解析的。
内容的提问来源于stack exchange,提问作者Tobias Lie-Atjam
相关产品推荐
相关产品推荐

