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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:45:03