如何在C#中实现MongoDB数组元素不存在时插入及Upsert功能?
MongoDB C# 实现数组元素不存在时插入(含Upsert)
核心思路
通过UpdateOneAsync方法,结合精准过滤条件和Upsert配置实现需求:
- 过滤条件同时匹配
empId,并确保目标数组中不存在指定id的技能元素 - 用
Push操作添加新技能 - 开启
IsUpsert=true,当匹配文档不存在时自动创建新文档
代码实现
1. 定义实体类
public class TechnicalSkill { public int empid { get; set; } public int id { get; set; } public string value { get; set; } } public class Employee { public int empId { get; set; } public string empName { get; set; } public List<TechnicalSkill> empTechnicalSkills { get; set; } = new List<TechnicalSkill>(); }
2. 核心操作代码
// 初始化MongoDB客户端与集合 var mongoClient = new MongoClient("mongodb://localhost:27017"); var database = mongoClient.GetDatabase("YourDatabaseName"); var collection = database.GetCollection<Employee>("YourCollectionName"); // 待插入的技能数据 var newSkill = new TechnicalSkill { empid = 100, id = 3, value = "sql server" }; // 构建过滤条件:匹配empId,且数组中无对应id的技能 var filter = Builders<Employee>.Filter.And( Builders<Employee>.Filter.Eq(e => e.empId, newSkill.empid), Builders<Employee>.Filter.Not( Builders<Employee>.Filter.ElemMatch(e => e.empTechnicalSkills, s => s.id == newSkill.id) ) ); // 构建更新操作:推送新技能到数组;若需Upsert时设置empName,可加入SetOnInsert var update = Builders<Employee>.Update.Combine( Builders<Employee>.Update.Push(e => e.empTechnicalSkills, newSkill), Builders<Employee>.Update.SetOnInsert(e => e.empName, "未知姓名") // 仅创建新文档时生效 ); // 执行更新(开启Upsert) var result = await collection.UpdateOneAsync(filter, update, new UpdateOptions { IsUpsert = true }); // 可选:查看操作结果 Console.WriteLine($"匹配文档数:{result.MatchedCount},修改文档数:{result.ModifiedCount},是否新增文档:{result.UpsertedId != null}");
场景验证
- 场景1(empId=100,技能id=3):过滤条件匹配到目标文档,且数组中无id=3的元素,执行Push操作,
ModifiedCount=1 - 场景2(empId=100,技能id=1):过滤条件因数组中存在id=1的元素而不匹配,无任何操作,
ModifiedCount=0 - 场景3(empId=101,技能id=1):找不到匹配文档,触发Upsert自动创建新文档并插入技能,
UpsertedId有值
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

