MongoDB 4.4.8下updateMany的$set使用聚合操作报错如何解决
错误原因
你当前使用的是MongoDB普通更新语法,该模式下$set后仅支持传入静态写入值,MongoDB会将你写的{ $toUpper: "$field" }识别为要给field字段存入的对象,而MongoDB禁止存储带$前缀的字段名,因此触发报错。
你提到的4.2+版本支持的「更新搭配聚合操作符」功能,需要显式使用聚合管道更新模式触发,普通更新语法下不会识别聚合操作符。
正确修改方案
只需要将updateMany的第二个参数(更新逻辑)外层包裹一层方括号[],标识这是聚合管道格式,即可正常使用$toUpper、$concat这类聚合操作符:
db.collection.updateMany( { field: { $regex: "[a-z]+"}}, // 外层加[]启用聚合管道更新模式 [ { $set: { field: { $toUpper: "$field" } } } ] )
同类操作示例
给字段追加内容的场景同样适配该规则,示例如下:
// 给所有文档的field字段原有值后追加后缀"_v2" db.collection.updateMany( {}, [ { $set: { field: { $concat: [ "$field", "_v2" ] } } } ] )
注意事项
- 聚合管道更新模式仅支持使用
$set(别名$addFields)、$unset(别名$project)、$replaceRoot三类聚合阶段,可覆盖绝大多数字段动态更新需求。 - 只有聚合管道更新模式支持在更新时引用当前文档的其他字段值做计算,普通更新语法仅支持写入固定值。
内容的提问来源于stack exchange,提问作者Boris Mulder
相关产品推荐
相关产品推荐

