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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:36:29