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

NextJS集成MongoDB:无法删除用户hostingEvents数组中的事件ID

问题解决:无法从用户的hostingEvents数组中删除对应事件ID

问题根源

你的用户文档中hostingEvents数组存储的是直接的ObjectId值(而非包含_id字段的子文档),但你在$pull操作中使用了嵌套对象的匹配条件{ _id: params.id },这导致MongoDB无法匹配到数组中的元素。

看你的用户文档结构:

"hostingEvents": [
  { "$oid": "65aaab34277e0f044566eef2" },
  { "$oid": "65aedf5201f7cdf66482fb82" }
]

这里的每个元素都是单独的ObjectId,不是{ _id: ObjectId("xxx") }这种结构,所以你的匹配条件不生效。

修正方案

1. 调整$pull的匹配条件

直接将hostingEvents的匹配值设为转换后的ObjectId即可:

{ $pull: { hostingEvents: ObjectId(params.id) } }

确保代码中已从mongoose或mongodb包导入ObjectId,避免出现引用错误。

2. (可选)用事务保证操作原子性

删除事件和更新用户是两个独立操作,为了避免出现“事件删除成功但用户数组未更新”的数据不一致情况,建议用MongoDB事务包裹这两个操作:

import { ObjectId } from 'mongoose';

export const DELETE = async (_, { params }) => {
  const session = {
    user: {
      name: 'user1',
      email: 'user1@gmail.com',
      id: '659c53e3cd9f958dcc3433c0',
    },
    expires: '2024-02-21T18:34:45.304Z',
  };

  if (!session) {
    return new Response('请登录', { status: 401 });
  }

  let mongoSession;
  try {
    await connectToDB();
    mongoSession = await mongoose.startSession();
    mongoSession.startTransaction();

    // 删除事件
    const deletedEvent = await Event.findByIdAndDelete(params.id, { session: mongoSession });
    if (!deletedEvent) {
      await mongoSession.abortTransaction();
      return new Response('未找到该事件', { status: 404 });
    }

    // 更新用户的hostingEvents数组
    const updatedUser = await User.findOneAndUpdate(
      { _id: session.user.id },
      { $pull: { hostingEvents: ObjectId(params.id) } },
      { session: mongoSession, new: true }
    );

    if (!updatedUser) {
      await mongoSession.abortTransaction();
      return new Response('未找到对应用户', { status: 404 });
    }

    await mongoSession.commitTransaction();
    return new Response('事件已删除', { status: 200 });
    
  } catch (error) {
    if (mongoSession) await mongoSession.abortTransaction();
    console.error('删除失败:', error);
    return new Response('删除事件出错', { status: 500 });
  } finally {
    if (mongoSession) mongoSession.endSession();
  }
};

验证要点

  • 确认ObjectId已正确导入
  • 检查params.id是否为有效的MongoDB ID字符串
  • 可以在更新后打印updatedUser,确认hostingEvents数组是否已移除目标ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:27:36