对象MotorLatentCommandCursor不能在'await'表达式中使用

时间:2018-12-13 09:48:42

标签: python mongodb tornado tornado-motor

在龙卷风中使用马达连接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不能在'await'表达式中使用”

idk为什么〜好像没什么问题

2 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

在官方文档中说:一个可以在await表达式中使用的对象。可以是协程或具有 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)