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

用户离开Discord服务器时,无法通过Mongoose删除MongoDB文档求助

解决Discord机器人用户离开时无法删除MongoDB文档的问题

问题根源

你的代码存在两个核心匹配错误:

  1. 字段值不对应:成员加入时,User字段存储的是用户用户名(member.user.username),但离开时查询/删除用的是用户ID(member.user.id),导致MongoDB找不到对应文档。
  2. ID字段歧义:加入时id字段用member.id,离开时用member.user.id,虽两者通常一致,但统一用用户ID更规范且不易出错。

修正后的代码

成员加入代码

const test = require('../schmeas/GuildSchema.js');

module.exports = {
  name: Events.GuildMemberAdd,
  once: false,
  async execute(member) {
    const welcomeChannel = member.guild.channels.cache.get('1111700932858761278');
    const welcomeMessage = `Welcome, ${member}! Enjoy your time here.`;

    welcomeChannel.send(welcomeMessage);

    try {
      // 改用用户ID作为查询匹配的核心字段,可选保留用户名用于展示
      let forn = new test({   
        User: member.user.id, // 存储用户唯一ID,确保查询精准
        Username: member.user.username, // 可选:留存用户名
        Guild: member.guild.id,
        id: member.user.id // 统一使用用户ID
      });
      await forn.save()
        .then(s => console.log(`saved : ${s}`))
        .catch(error => {
          console.log('Error saving document:', error);
        });
    } catch (error) {
      console.error('Error saving new member data:', error);
    }
  },
};

成员离开代码

const { Events } = require('discord.js');
const test = require('../schmeas/GuildSchema.js');

module.exports = {
  name: Events.GuildMemberRemove,
  once: false,
  async execute(member) {
    let channelwel = member.guild.channels.cache.get('1111700932858761278');
    let thing = `User ${member.user.tag} left. Bye!`;

    try {
      // 查询条件与存入时的字段完全匹配
      const deleted = await test.deleteOne({
          User: member.user.id,
          Guild: member.guild.id,
          id: member.user.id
        })
        .then(s => console.log(`delete ${s}`))
        .catch(e => console.log(e));
      console.log(deleted.deletedCount); // 通过删除数量验证操作结果
      
    } catch (error) {
      console.error('Error occurred during deletion:', error);
    }

    channelwel.send(thing);
  },
};

额外建议

  • 优先用用户ID作为MongoDB文档的查询标识,因为用户名可修改,但用户ID永久唯一。
  • 可在Schema中给User和Guild字段添加唯一索引,避免重复插入同一用户的文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:10