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

使用$each向MongoDB存储字符串数组时触发CastError求助

解决MongoDB $each操作符的CastError问题

错误原因

你的代码存在两个核心问题:

  • 后端解析数组后多套了一层数组:JSON.parse(req.body.tags)已经能得到目标字符串数组["ONE","TWO","THREE"],但你把它放进[JSON.parse(req.body.tags)]后,$each接收的是[["ONE","TWO","THREE"]]——MongoDB会尝试把内层数组转成字符串存入tags字段(Schema定义为[String]),因此触发CastError。
  • updateOne参数顺序错误:updateOne的第一个参数是查询条件(用来定位要更新的文档),第二个才是更新操作,你之前把更新操作放在了第一个参数的位置,会导致查询逻辑错误。

修正后的代码

前端代码(无需修改)

let array = ["ONE","TWO","THREE"]

let data = new FormData();
data.append("tags", JSON.stringify(array));

后端代码

// 替换为实际的查询条件,比如根据文档ID定位
const targetArtId = "需要更新的文档ID";

const updateResult = await newArt.updateOne(
  { _id: targetArtId }, // 第一个参数:查询条件
  {
    $push: {
      tags: {
        $each: JSON.parse(req.body.tags), // 直接传入解析后的数组,无需额外包裹
      },
    },
  },
  { returnOriginal: false } // 若需要返回更新后的文档,使用该选项(updateOne不支持new:true)
);

Schema定义(修正拼写错误)

tags: {
  type: [String],
  required: true // 原拼写require有误,修正为required
},

补充说明

  • 若不需要返回更新后的文档,可以省略第三个参数。
  • 修正Schema中的require为required,避免后续字段校验逻辑出错。

内容的提问来源于stack exchange,提问作者Captai-N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:56:15