MongoDB如何实现同文档嵌套字段间的值赋值更新
问题根因
普通形式的$set更新操作中,传入的字段值会被直接作为字面值处理,带$前缀的字符串不会被解析为文档字段的引用路径,因此你之前的操作才会把路径文本直接赋值给目标字段。
要实现同文档内的字段值拷贝,核心是让MongoDB识别字段路径对应的实际值,可根据自身的MongoDB版本选择对应实现方案。
实现方案1:聚合管道式更新(MongoDB 4.2+ 版本适用)
MongoDB 4.2之后支持在updateOne/updateMany这类更新方法中,传入聚合管道作为更新规则。这种场景下,管道内$前缀的路径会被正常解析为文档字段的实际值,写法如下:
db.mongodb_tbl_resumecard_all.updateOne( {"_id" : ObjectId("609111c7ba749712215cff37")}, // 注意这里传入的是数组形式的聚合管道,不是单个操作符对象 [ { $set: { "CompanyExperience.Company1.JobTitle": "$CompanyExperience.Company2.JobTitle" } } ] )
执行这段代码后,目标文档中Company1的JobTitle就会被赋值为Company2里的实际岗位值"Sales-Coordinators",不会再出现路径文本被当值赋值的问题。如果需要批量对集合内所有匹配文档执行这类值拷贝,这种管道写法可以一次完成全量处理,不需要逐次查询取值,性能更高。
实现方案2:低版本MongoDB兼容写法
如果你的MongoDB版本低于4.2,不支持聚合管道更新,就需要分两步手动取源字段值再更新:
- 先通过查询拿到目标文档里源字段的实际值
- 将取到的实际值作为参数传入普通
$set操作完成更新
示例代码:
// 第一步:查询目标文档,取出源岗位值 const targetDoc = db.mongodb_tbl_resumecard_all.findOne({ "_id": ObjectId("609111c7ba749712215cff37") }); const sourceJobTitle = targetDoc.CompanyExperience.Company2.JobTitle; // 第二步:用拿到的实际值更新目标字段 db.mongodb_tbl_resumecard_all.updateOne( { "_id": ObjectId("609111c7ba749712215cff37") }, { $set: { "CompanyExperience.Company1.JobTitle": sourceJobTitle } } )
内容的提问来源于stack exchange,提问作者Gopal
相关产品推荐
相关产品推荐

