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()})
当我搜索 176311
和 markovia
但 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"
但是使用星号将允许您输入不带引号的参数。
参考文献:
这是我在 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()})
当我搜索 176311
和 markovia
但 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"
但是使用星号将允许您输入不带引号的参数。