Mongoose deleteMany批量删除报错解决:name相同phone不同场景
问题描述
在Node.js开发简易API时,需要批量删除MongoDB中name字段相同但phone字段不同的文档,使用Mongoose的deleteMany方法时触发CastError,提示无法将数组类型的值转换为Number类型的phone字段。
报错信息
{ "stringValue": "\"[ 9888889999, 888888 ]\"", "valueType": "Array", "kind": "Number", "value": [ 9888889999, 888888 ], "path": "phone", "reason": { "generatedMessage": true, "code": "ERR_ASSERTION", "actual": false, "expected": true, "operator": "==" }, "name": "CastError", "message": "Cast to Number failed for value \"[ 9888889999, 888888 ]\" (type Array) at path \"phone\" for model \"group\"" }
现有代码
router.get('/delete_members',(req,res)=>{ Group.deleteMany({name:req.body.name,phone:{$in:[req.body.phone]}},(err,doc)=>{ if(err) res.send(err); else res.json(doc) }) })
数据库文档示例
_id: 62e37c2a9f2011c103402b7d, name: "college group", phone: 9888889999, __v:0 _id: 62e37c2a9f2011c103402b7e, name: "Family Group", phone: 888888, __v:0 _id: 62e37c2a9f2011c103402b7f, name: "Family Group", phone: 9888889999, __v:0 _id: 62e37c5f839bb9c7fb2ed4c8, name: "Family Group", phone: 9888889999, __v:0 _id: 62e37c5f839bb9c7fb2ed4c9, name: "Family Group", phone: 9888889999, __v:0 _id: 62e37c5f839bb9c7fb2ed4ca, name: "Family Group", phone: 9888889999, __v:0 _id: 62e37c5f839bb9c7fb2ed4cb, name: "Family Group", phone: 9888889999, __v:0 _id: 62e37c5f839bb9c7fb2ed4cc, name: "Family Group", phone: 9888889999, __v:0
Schema定义
const groupSchema=new mongoose.Schema({ name:String, phone:Number })
Postman请求参数
{ "name":"Family Group", "phone":[888888,9888889999] }
解决方案
错误原因
代码中phone:{$in:[req.body.phone]}是错误写法:req.body.phone本身已是数组[888888,9888889999],外层再套方括号会变成二维数组[[888888,9888889999]],Mongoose尝试将这个二维数组转换为Number类型的phone字段,触发类型转换错误。
修复步骤
1. 修正查询条件
直接使用req.body.phone作为$in的参数,去掉外层多余的方括号:
router.get('/delete_members',(req,res)=>{ Group.deleteMany({ name: req.body.name, phone: { $in: req.body.phone } },(err,doc)=>{ if(err) { res.send(err); } else { res.json(doc); } }) })
2. (可选)规范请求方法
删除操作建议使用DELETE请求,更符合RESTful规范:
router.delete('/delete_members',(req,res)=>{ Group.deleteMany({ name: req.body.name, phone: { $in: req.body.phone } },(err,doc)=>{ if(err) { res.status(500).send(err); } else { res.json({ message: '删除成功', deletedCount: doc.deletedCount }); } }) })
3. (可选)添加参数校验
避免空值或非数组参数传入,同时确保phone元素为Number类型:
router.delete('/delete_members',(req,res)=>{ const { name, phone } = req.body; // 基础参数校验 if (!name || !Array.isArray(phone) || phone.length === 0) { return res.status(400).send('参数错误:name必填,phone必须是非空数组'); } // 转换数组元素为Number,确保与Schema类型匹配 const phoneNumbers = phone.map(num => Number(num)); Group.deleteMany({ name, phone: { $in: phoneNumbers } },(err,doc)=>{ if(err) { res.status(500).send(err); } else { res.json({ message: '删除成功', deletedCount: doc.deletedCount }); } }) })
内容的提问来源于stack exchange,提问作者Jeevan Shrestha
相关产品推荐
相关产品推荐

