0

在 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 不能用于 'await' 表达式”

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

4

3 回答 3

1

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)
于 2018-12-13T12:06:31.193 回答
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)
于 2019-05-31T06:23:00.827 回答
0

通过添加 to_list()。这对我有用

all_user = await self.db.account.aggregate([
            {'$match': {'status': 1}},
            {'$group': {'_id':''}}]).to_list(1000)
于 2022-03-04T06:59:18.080 回答