我如何检查“_id”字段的值是否存在以及如何根据它读取、写入、更新和删除数据

How can i check if the value for "_id" field exists and how to read, write, update and delete data based on it

我有一个用于处理用户注释的 discord 机器人。所以机器人基本上将字符串作为注释存储在数据库中的列表中。注释是特定于用户的。我尝试将 ctx.author.id 设置为“_id”字段的值,然后检查使用该命令的人的用户 ID 是否等于数据库中任何文档中“_id”的值。但是没用。

这是我的命令代码:

@client.command()
async def makenotes(ctx, *, args):
    try:
        if (len(db.NoteBoyNotes.find_one({'_id':ctx.author.id})) == 0):
            NotesUpdateDict = {'_id':ctx.author.id, 'notes':[]}
            NotesUpdateDict['notes'].append(args)
            NBNotes.update(NotesUpdateDict)
            x = notesCol.insert_one(NBNotes)
            await ctx.send("Ok, Noted")
        else:
            pass
    except:
        await ctx.send("Some error occurred")

有人可以帮忙吗?另一件事,我使用 motor 作为 asyncio,而不是 pymongo

编辑: 这是错误: enter image description here

试试这个:

@client.command()
async def makenotes(ctx, *, args):
    try:
        check = awaut db.NoteBoyNotes.find_one({'_id':ctx.author.id})
        if (len(check) == 0):
            NotesUpdateDict = {'_id':ctx.author.id, 'notes':[]}
            NotesUpdateDict['notes'].append(args)
            NBNotes.update(NotesUpdateDict)
            x = notesCol.insert_one(NBNotes)
            await ctx.send("Ok, Noted")
        else:
            pass
    except:
        await ctx.send("Some error occurred")

您需要 await db.NoteBoyNotes.find_one 以便获得返回值而不是未来值。

此外,我相信找到一个 Returns 单个文档,或者 None 如果找不到匹配的文档。所以你检查检查是否是 None 而不是 len().

此答案来自@kpie 发表的评论,

@client.command()
async def makenotes(ctx, *, args):
    try:
        check = await db.NoteBoyNotes.find_one({'_id':ctx.author.id})
        if (check is None):
            NotesUpdateDict = {'_id':ctx.author.id, 'notes':[]}
            NotesUpdateDict['notes'].append(args)
            NBNotes.update(NotesUpdateDict)
            x = notesCol.insert_one(NBNotes)
            await ctx.send("Ok, Noted")
        else:
            pass
    except:
        await ctx.send("Some error occurred")```