用户离开Discord服务器时,无法通过Mongoose删除MongoDB文档求助
解决Discord机器人用户离开时无法删除MongoDB文档的问题
问题根源
你的代码存在两个核心匹配错误:
- 字段值不对应:成员加入时,
User字段存储的是用户用户名(member.user.username),但离开时查询/删除用的是用户ID(member.user.id),导致MongoDB找不到对应文档。 - 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
相关产品推荐
相关产品推荐

