Python - получение документа из MongoDB [motor_asyncio]
в MongoDB создайте коллекцию «безопасности» с индексом uniq для «имени пользователя», я использую motor.motor_asynci для работы с Mongo. пытается получить документ, связанный с "именем пользователя" следующим образом:
from motor.motor_asyncio import AsyncIOMotorClient
def load_config() -> dict:
with open('config/config.yml') as yaml_file:
conf = yaml.load(yaml_file.read(), Loader=yaml.SafeLoader)
return conf
CONF = load_config()
## Mongo
DB_CLIENT = AsyncIOMotorClient(
host=CONF.get("databases", dict())["mongo"]["HOST"],
port=CONF.get("databases", dict())["mongo"]["PORT"],
username=CONF.get("databases", dict())["mongo"]["USER"],
password=CONF.get("databases", dict())["mongo"]["PASSWORD"],
)
DB = DB_CLIENT[CONF.get("databases", dict())["mongo"]["NAME"]]
cursor_user = DB.security.find({'username': "someuser"})
for doc in cursor_user:
print (doc)
получение «TypeError: объект 'AsyncIOMotorCursor' не повторяется»
поскольку эта коллекция имеет индекс uniq по ключу поиска, я также пробовал find_one, но тоже не работал:
user = DB.security.find_one({'username': "someuser"})
print(user)
получение:<Ожидаемый в будущем cb = [run_on_executor .._ call_check_cancel () в /usr/local/lib/python3.8/site-packages/motor/frameworks/asyncio/ init .py: 80]>
Обновление [решено]:
Я создаю функцию в своем файле конфигурации и импортирую ее в файл маршрутов. Обратите внимание, что по умолчанию он также подавляет _id, поступающий из Mongo.
async def search_user(username: str):
user = await security_collection.find_one({"username": username} ,{"_id":0})
return user
из маршрутизации:
@security_router.get("/find_username")
async def search_username(username: str):
user = await search_user(username)
print("User main",user)
if user:
return ResponseModel(
"User: {} exist ".format(user), "Something"
)
return ErrorResponseModel(
"An error occurred", 404, "User {0} doesn't exist".format(username)
)