MongoDB C# Driver如何实现嵌套数组元素的Upsert操作
MongoDB C# 实现嵌套数组按条件插入不存在元素
前置修正(原有代码笔误)
在补全逻辑前先修正两处代码错误:
Builders<CcodeInfo>.Filter拼写错误,应为Builders<CodeInfo>.Filterx.Barcode属性错误,应为x.Code(CodeInfo实体无Barcode属性)
插入不存在Code的实现逻辑
核心思路是利用MongoDB原子条件更新,仅当Codes数组中不存在对应Code时才执行Push操作,无需提前查询全量数组,避免并发冲突。补全insertNewCodeModels部分代码如下:
// insert new codes, only if not already existing var insertNewCodeModels = myDoc.Codes.Select(x => { // 过滤条件:当日文档存在,且Codes数组中不存在当前Code的元素 var codeNotExistFilter = filterMyDocBuilder.Not( filterMyDocBuilder.ElemMatch(day => day.Codes, c => c.Code == x.Code) ); var filterDefinition = filterDate & codeNotExistFilter; // 更新操作:将当前CodeInfo对象追加到Codes数组 var pushUpdate = updateMyDocBuilder.Push(c => c.Codes, x); return new UpdateOneModel<MyDoc>(filterDefinition, pushUpdate) { IsUpsert = false }; }).ToList();
效果验证
配合你已实现的空Ident更新逻辑,最终执行效果完全符合预期:
- Code为1000的元素:数组中已存在且Ident非空,过滤条件不匹配,无操作
- Code为1002的元素:数组中存在且Ident为空,执行更新操作
- Code为1003的元素:数组中不存在,执行插入操作
内容的提问来源于stack exchange,提问作者Abra Sat
相关产品推荐
相关产品推荐

