使用$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
相关产品推荐
相关产品推荐

