如何用pymongo+discord.py在单条消息中列出MongoDB的键与值
解决方法
你的问题出在遍历文档键值对时逐个调用await ctx.send(),导致每条数据单独发送。只需要先把所有统计内容拼接成一个完整的字符串(或用Discord Embed格式化),最后一次性发送即可。
修改后的基础版代码
@hybrid_command(name="kayitsayi") async def kayitsayi(ctx): guild_id = ctx.guild.id # 查询目标服务器的注册数据 staff_data = await staffs.find_one({"guild_id": guild_id}) if not staff_data: await ctx.send("暂无注册统计数据") return # 初始化消息内容,添加标题 stats_content = "📋 注册统计列表:\n" # 遍历键值对,跳过guild_id字段 for user_id, reg_count in staff_data.items(): if user_id == "guild_id": continue # 将每个用户的统计信息追加到内容中 stats_content += f"- <@{user_id}>:{reg_count} 次注册\n" # 一次性发送完整消息 await ctx.send(stats_content)
进阶:用Embed美化展示(推荐)
如果数据较多,用Discord Embed会更整洁,还能避免字符长度超限问题:
from discord import Embed @hybrid_command(name="kayitsayi") async def kayitsayi(ctx): guild_id = ctx.guild.id staff_data = await staffs.find_one({"guild_id": guild_id}) if not staff_data: await ctx.send("暂无注册统计数据") return # 创建Embed对象,设置标题和颜色 stats_embed = Embed(title="📋 成员注册统计", color=0x2b2d31) for user_id, reg_count in staff_data.items(): if user_id == "guild_id": continue # 向Embed中添加字段 stats_embed.add_field(name=f"<@{user_id}>", value=f"注册次数:{reg_count}", inline=False) await ctx.send(embed=stats_embed)
关键修改点
- 取消循环内的
await ctx.send(),改为先拼接内容 - 用换行或列表符号分隔每个统计条目,保证可读性
- 最终仅调用一次
await ctx.send()发送完整内容
内容的提问来源于stack exchange,提问作者disalperous
相关产品推荐
相关产品推荐

