python 如何通过输入不完整或不准确的名称在Motor MongoDB中查找对象(包含字段)?

6ie5vjzr  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(137)

我正在PyCord上创建一个经济不和谐机器人,它有一个可以添加物品的商店。我希望它可以在不输入物品确切名称的情况下购买物品,如果找到多个物品,则会显示找到的物品列表。用户可以简单地选择物品(我可以自己做)。
然而,我遇到了在MongoDB中搜索对象的问题,我尝试使用**$regex**操作符,但它没有找到任何东西。

我希望按如下方式执行搜索:用户输入带有物品名称的查询,很可能不准确、不完整等,但机器人会尝试查找该物品。例如:

请求:“项目”

数据库:

Shop:
    Items:
        Item A:
            price: 280
        Item B:
            price: 250
        Item C:
            price: 200
            description: "Good Item"

在这种情况下,它应该找到所有的Item对象(A、B、C),并将它们输出为列表,用户必须选择一个(我自己可以解决这个问题)我希望我的问题已经很清楚了:)

我的密码:

search = await economy_db.find_one({"_id": ctx.guild.id, "Shop.Items": {"$regex": "item"}})
ztigrdn8

ztigrdn81#

问题是您使用的find_one总是返回一个对象。
您应该使用find方法,该方法返回满足查询的所有文档。
添加re(python正则表达式模块)的用法,得到:

import re

matching_items = list(economy_db.find({'Shop.Items': re.compile(<YOUR_REGEX>)}))

或者在MongoDB中使用$regex操作符:

matching_items = list(economy_db.find({'Shop.Items': {'$regex': <YOUR_REGEX>}}))

注意两点:
1.如果你希望正则表达式搜索不区分大小写,那么在第一个例子中,你应该把re.IGNORECASE加到compile函数中,在第二个例子中,把$options: 'i'加到$regex运算符中。
1.我没有包括"_id": ctx.guild.id部分,因为它对每个文档都是唯一的,我们希望所有文档的项目名称满足正则表达式搜索。
希望能有所帮助!

相关问题