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

如何用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)

关键修改点

  1. 取消循环内的await ctx.send(),改为先拼接内容
  2. 用换行或列表符号分隔每个统计条目,保证可读性
  3. 最终仅调用一次await ctx.send()发送完整内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:00:34