MongoDB根据嵌套文档现有内容更新新增字段实现方法
解决方案
这个需求完全可以实现,你原来的筛选逻辑没问题,卡壳的点是普通更新语法的$set不支持直接读取当前匹配的数组元素做值转换,换成聚合管道更新就能解决。
核心思路
- 原有的arrayFilters规则可以直接保留,只筛选
type为programmer、technologies字段存在且非空的jobs子文档,避免无效更新 - 用MongoDB 4.2及以上版本支持的聚合管道更新语法,在$set阶段通过
$map算子遍历当前匹配到的job下的technologies数组,直接提取每个元素的name字段,组装成目标数组赋值给it_technologies - 更新不会改动jobs子文档下的原有字段,只会新增要求的
it_technologies字段
最终可执行代码
db.runCommand({ update: "employees", updates: [ { q: {}, // 注意这里u的值是数组,代表使用聚合管道更新 u: [ { $set: { "jobs.$[j].it_technologies": { $map: { input: "$$j.technologies", as: "tech", in: "$$tech.name" } } } } ], upsert: false, multi: true, arrayFilters: [ { "j.type": "programmer", "j.technologies": {$exists: true, $ne: []} } ] } ] });
注意事项
- 该语法依赖MongoDB 4.2+的聚合更新特性,如果你的实例版本低于4.2,无法在单条更新语句中完成该操作,需要先查询匹配文档,在业务层提取字段值后再逐条更新
- 执行后非programmer类型的jobs子文档不会被改动,完全符合筛选要求
内容的提问来源于stack exchange,提问作者cichystefan
相关产品推荐
相关产品推荐

