pymongo find_one 在 discord.py 命令中使用时重新运行 None 但在终端中工作正常

pymongo find_one retruning None when used in discord.py command but working fine in terminal

这是我在 collection 中搜索的文档。

{'_id': ObjectId('5fef0220e37ad50a37582bc1'), 'nationid': 176311, 'nation': 'Markovia', 'leader': 'Sam Cooper', 'continent': 'Africa', 'war_policy': 'Pirate', 'color': 'beige', 'alliance': 'Arrgh', 'allianceid': 913, 'allianceposition': 3, 'cities': 19, 'infrastructure': 11400, 'offensivewars': 0, 'defensivewars': 
0, 'score': 2283.09, 'rank': 10, 'vacmode': 0, 'minutessinceactive': 50, 'query_nation': 'markovia', 'query_leader': 'sam cooper'}

我有这个功能,应该可以让我使用 "nationid""query_nation""query_leader":

进行搜索
def find_nation(nation):
    if nation.isnumeric():
        nation = int(nation)
        return db.nations.find_one({"nationid":nation})
    else:
        result = db.nations.find_one({"query_nation":nation.lower()})
        if result:
            return result
        else:
            return db.nations.find_one({"query_leader":nation.lower()})

当我搜索 176311markovia 但 returns None 搜索 sam cooper

时,此命令工作正常
@client.command()
async def nation(ctx, nation):
    nation_dict_1 = find_nation(nation)
    if nation_dict_1:
        await ctx.send(f'{nation_dict_1["leader"]} of {nation_dict_1["nation"]}')
    else:
        await ctx.send('Could not find an exact match.')

然而,当我在终端中使用它时,它对所有 3 个都工作正常并且每次都打印文档。 (也有 sam cooper

nation_dict_1 = find_nation(nation)
if nation_dict_1:
    print(nation_dict_1)
else:
    print('Could not find an exact match.')

这是将参数传递到命令的方式的问题。由于中间的 space,sam cooper 将不起作用。要解决此问题,您可以使用星号的“消耗剩余”功能。

试试这个,你重写的命令:

@client.command()
async def nation(ctx, *, nation):
    nation_dict_1 = find_nation(nation)
    if nation_dict_1:
        await ctx.send(f'{nation_dict_1["leader"]} of {nation_dict_1["nation"]}')
    else:
        await ctx.send('Could not find an exact match.')

如果您这样做,您当前的命令将起作用:
!nation "sam cooper"
但是使用星号将允许您输入不带引号的参数。


参考文献: