在龙卷风中使用马达连接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为什么〜好像没什么问题
答案 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)