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

Node.js Mongoose:如何从文档数组中移除单个ID?

如何移除MongoDB文档数组中的指定ID?

我的模型文档中包含一个Object ID数组,我希望移除该数组中的一个ID,请问这是否可以实现?

包含Object ID数组的文档

以下是我尝试的代码:

module.exports.RemoveFavourite = async (req, res, next) => {
  try {
    const userId = req.params.user;
    const favouriteId = req.params.event;

    const removeFavourite = await User.updateOne(
      { _id: userId },
      { $pull: { favourites: favouriteId } }
    );

    res.status(200).json(removeFavourite);
  } catch {
    res.status('404').json('error');
  }
};

当然可以实现,MongoDB的$pull操作符就是专门用来移除数组中匹配指定条件的元素的,你的代码思路没问题,但有两个细节需要调整:

  1. 类型匹配问题:如果你的favourites数组存储的是MongoDB的ObjectId类型,而从req.params拿到的favouriteId是字符串,直接用字符串匹配ObjectId会找不到对应元素,需要先把字符串转换成ObjectId:

    // 用mongoose的话这样导入
    const { ObjectId } = require('mongoose').Types;
    // 用原生MongoDB驱动的话:const { ObjectId } = require('mongodb');
    const favouriteId = ObjectId(req.params.event);
    
  2. 错误处理的状态码问题:res.status()的参数必须是数字,你的代码里写了res.status('404'),要改成res.status(404),否则会触发错误。

修改后的完整代码示例:

const { ObjectId } = require('mongoose').Types;

module.exports.RemoveFavourite = async (req, res, next) => {
  try {
    const userId = ObjectId(req.params.user); // userId也建议转成ObjectId,避免类型不匹配
    const favouriteId = ObjectId(req.params.event);

    const removeFavourite = await User.updateOne(
      { _id: userId },
      { $pull: { favourites: favouriteId } }
    );

    // 可以判断是否成功移除,优化返回信息
    if (removeFavourite.modifiedCount === 0) {
      return res.status(404).json('未找到对应的收藏项或用户');
    }

    res.status(200).json('收藏项已成功移除');
  } catch (err) {
    console.error(err); // 打印错误信息方便排查问题
    res.status(500).json('服务器内部错误');
  }
};

另外建议在catch中捕获错误对象并打印,方便后续排查问题,不要只返回模糊的'error'提示。

内容的提问来源于stack exchange,提问作者Harvey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:10:24