PyMongo报错Not a valid ObjectId,Discord机器人黑名单功能异常
错误根因
- MongoDB的
ObjectId有严格的格式限制,仅支持12字节二进制值或24位十六进制字符串,而Discord用户ID为18位十进制数值,不符合ObjectId的格式要求,强制转换会触发bson.errors.InvalidId报错 - 原有代码存在逻辑硬错误:
if True的判断永远成立,无论用户是否在黑名单都会被拦截
解决方案
不需要强制使用ObjectId作为MongoDB文档的_id,直接将Discord原生的用户ID数值作为_id存储和查询即可,同时修正判断逻辑、补充边界校验。
修正后代码
@bot.event async def on_message(message): # 过滤机器人自身消息,避免死循环 if message.author.bot: return author_id = message.author.id # 直接用Discord用户ID查询,无需转换为ObjectId check_blacklist = collection.find_one({"_id": author_id}) if check_blacklist: await message.channel.send("You have been blacklisted from using the bot commands") else: await bot.process_commands(message) @bot.command(aliases=["bl"]) async def blacklist(ctx, *, member: discord.Member = None): if member is None: await ctx.send("Mention a member to blacklist them!") return # 重复校验,避免插入重复ID触发报错 if collection.find_one({"_id": member.id}): await ctx.send("This user is already in the blacklist") return post = {"_id": member.id} collection.insert_one(post) await ctx.send(f"Successfully added {member.mention} to blacklist")
注意:如果集合中已有旧的黑名单数据,需要先清理格式不匹配的记录,保证所有
_id都为Discord原生数值类型的用户ID,避免查询不匹配。
内容的提问来源于stack exchange,提问作者0xMukesh
相关产品推荐
相关产品推荐

