使用Mongoose删除MongoDB数组对象:执行成功但未实际移除如何解决
问题根因
你遇到的问题核心是类型不匹配:
MongoDB文档中likedsongs数组下的_id存储为ObjectId类型,但你在$pull条件中传入的是字符串类型,两者类型不一致导致匹配不到对应元素,因此不会执行删除操作。由于查询语法本身合法,所以不会抛出错误,控制台会正常打印Removed。
修复方案
你需要将查询中用到的两个id都转换为ObjectId类型再传入,以下是适配Mongoose的修正代码:
const mongoose = require('mongoose'); User.findOneAndUpdate( // 用户_id也建议转为ObjectId,避免部分场景下自动转换失效 { _id: mongoose.Types.ObjectId("611fc7284bf68143086544f9") }, { $pull: { likedsongs: { _id: mongoose.Types.ObjectId("611d28e97782820fc039dd85") } } }, { new: true }, function(err, updatedDoc){ if(err){ console.log(err); }else{ // 打印返回的更新后文档,确认删除是否生效 console.log("Removed", updatedDoc.likedsongs); } } )
如果你使用的是原生MongoDB Node.js驱动,将mongoose.Types.ObjectId替换为require('mongodb').ObjectId即可。
其他排查点
如果修改后依然不生效,可以按以下顺序排查:
- 检查User模型的
likedsongs数组字段定义,确认数组内子文档的_id类型配置为ObjectId而非String - 确认当前连接的数据库环境和你查看的数据库是同一个,避免开发/测试环境混淆
- 打印返回的
updatedDoc,如果返回的文档中对应元素已经删除但数据库中未更新,检查是否开启了读写分离,读请求打到了未同步的从库
内容的提问来源于stack exchange,提问作者Saad Aslam
相关产品推荐
相关产品推荐

