MongoDB如何将嵌套数组内文档的字符串字段更新为int类型
MongoDB 5.0 数组内字符串字段转整数可行方案
原有写法错误原因
- 第一种普通更新写法不成立:
$toInt是聚合运算符,无法直接在非聚合格式的$set中调用;同时costo是数组类型,无数组匹配条件时不能使用$定位符,且字段值末尾带空格,直接转换会触发类型错误。 - 第二种聚合更新写法不成立:没有遍历
costo数组的每个元素,直接将数组整体覆盖为单对象,且字段路径引用错误,会丢失原有数组结构和其他字段。
可直接执行的正确代码
MongoDB 5.0.9版本支持聚合管道更新,通过$map遍历数组元素、$trim处理字符串首尾空格、$mergeObjects保留原有字段即可完成转换,代码如下:
db.proyectos.updateMany( {}, [ { $set: { costo: { $map: { input: "$costo", as: "costItem", in: { $mergeObjects: [ "$$costItem", { monto_un: { $toInt: { $trim: { input: "$$costItem.monto_un" } } }, unidades: { $toInt: { $trim: { input: "$$costItem.unidades" } } }, total: { $toInt: { $trim: { input: "$$costItem.total" } } } } ] } } } } } ] )
关键说明
- 更新参数外层包裹
[]表示使用聚合更新模式,该模式下才支持在更新操作中调用$toInt等聚合运算符。 $map负责遍历costo数组下的每一个元素,避免直接操作数组字段把整个数组覆盖为非数组结构。- 新增
$trim处理是因为示例数据中的数值字符串末尾带空格(如"7900 "),不去除空格直接转整数会抛出转换异常。 $mergeObjects会保留数组元素中原有的tipo、detalle等不需要修改的字段,不会造成数据丢失。
执行完成后可通过db.proyectos.findOne()查看转换结果,三个目标字段会从字符串类型转为int类型。
内容的提问来源于stack exchange,提问作者Godoy32
相关产品推荐
相关产品推荐

