Объект MotorLatentCommandCursor нельзя использовать в выражении 'await' - PullRequest
0 голосов
/ 13 декабря 2018

использовать двигатель в Tornado для подключения mongodb

я создал подключение двигателя

import motor.motor_tornado
from tornado.web import RequestHandler
client = motor.motor_tornado.MotorClient('mongodb://xxx')

class BaseHandler(RequestHandler):
    @property
    def db(self):
        return client['realtime-test']

class Account(BaseHandler):
    async def get(self,*args,**kwargs):
        all_user = await self.db.account.aggregate([
            {'$match': {'status': 1}},
            {'$group': {'_id':''}}
        ])
        print(all_user)

, когда я начал, я получил это сообщение: "объект MotorLatentCommandCursor не может быть использован в"жду "выражения"

idk почему ~ кажется, что ничего плохого

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

В официальной документации сказано: объект, который можно использовать в выражении ожидания.Может быть сопрограммой или объектом с методом await ().Вы можете получить дополнительную информацию из PEP 492: https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for

, также вы можете использовать asgiref, чтобы обернуть свою функцию:

from asgiref.sync import sync_to_async
import motor.motor_tornado
from tornado.web import RequestHandler
client = motor.motor_tornado.MotorClient('mongodb://xxx')

class BaseHandler(RequestHandler):
    @property
    def db(self):
        return client['realtime-test']

class Account(BaseHandler):
    async def get(self,*args,**kwargs):
        all_user = await sync_to_async(self.db.account.aggregate)([
            {'$match': {'status': 1}},
            {'$group': {'_id':''}}
        ])
        print(all_user)
0 голосов
/ 13 декабря 2018

Метод aggregate() возвращает курсор, который вы можете использовать в цикле.Вы не можете использовать его в операторе await, потому что это не ожидаемый объект.

Вы бы использовали что-то вроде этого:

async def get(self,*args,**kwargs):
    cursor = self.db.account.aggregate([
        {'$match': {'status': 1}},
        {'$group': {'_id':''}}
    ])

    all_user = []

    async for doc in cursor: 
        all_user.append(doc)

    print(all_user)
...