You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:39:21