You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现MongoDB数组元素不存在时插入及Upsert功能?

MongoDB C# 实现数组元素不存在时插入(含Upsert)

核心思路

通过UpdateOneAsync方法,结合精准过滤条件和Upsert配置实现需求:

  1. 过滤条件同时匹配empId,并确保目标数组中不存在指定id的技能元素
  2. 用Push操作添加新技能
  3. 开启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. 场景1(empId=100,技能id=3):过滤条件匹配到目标文档,且数组中无id=3的元素,执行Push操作,ModifiedCount=1
  2. 场景2(empId=100,技能id=1):过滤条件因数组中存在id=1的元素而不匹配,无任何操作,ModifiedCount=0
  3. 场景3(empId=101,技能id=1):找不到匹配文档,触发Upsert自动创建新文档并插入技能,UpsertedId有值

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:05:27