MongoDB/Node环境下如何将文档已有字段嵌套到新父级字段下
解决方案
你之前的更新操作出现字面量赋值问题,是因为常规更新语法不支持直接引用文档内的字段值,会将$settings.yAxis直接作为字符串写入。你可以使用MongoDB 4.2及以上版本支持的聚合管道更新语法,在单次原子操作内完成字段迁移,完全避免数据不一致问题。
正确代码如下:
async up(db) { const panels = db.collection('panels'); await panels.updateMany( { module: 'lalala' }, // 传入聚合管道数组实现字段操作 [ { $set: { 'settings.highcharts.yAxis': '$settings.yAxis' } }, { $unset: 'settings.yAxis' } ] ); }
说明
- 聚合管道更新模式下,MongoDB会正确识别
$settings.yAxis为当前文档的字段引用,读取对应值赋值到新路径 - 整次updateMany为原子操作,所有修改要么全部生效,要么全部回滚,不会出现新字段已创建、旧字段未删除的中间异常状态
- 无需遍历文档处理,性能远高于逐行操作,也不会出现异步遍历的await异常问题
内容的提问来源于stack exchange,提问作者R. Jutras
相关产品推荐
相关产品推荐

