Tornado / Motor上的聚合失败:产生了未知对象MotorAggregationCursor

时间:2016-03-19 04:17:06

标签: python mongodb mongodb-query aggregation-framework tornado-motor

我遇到在Tornado上执行MongoDB聚合操作的问题。这是代码,

pipeline = [
   {'$match': {
       '$or': [
           {'owner.id': '56dfdaa4082024b9384c0055'},
           {'members.top.member.id':'56dfdaa4082024b9384c0055'}
       ]
   }},
   {'$sort': {'date_s': -1}},
   {'$skip': 0},
   {'$limit': 20},
   {'$project':{
      'created_at': 1,
      'name': 1,
      'id': '$_id',
      'group.group_id': 1,
      '_id': 0,
      'permission': 1,
      'owner': 1,
      'type': 1,
      'members.total': 1,
      'desc': 1,
      'declared': 1
  }}
]
cursor = yield db.activities.aggregate(pipeline)

相同的命令在MongoDB管理工具上运行得非常好(我使用的是MongoChef)。但是在Python Tornado上,使用“yield”异步操作,它会抛出异常

yielded unknown object MotorAggregationCursor(<motor.core._LatentCursor object at 0x00000000042DEA58>)

任何想法?我没有进一步调试的线索......谢谢

1 个答案:

答案 0 :(得分:1)

实际的.aggregate()方法本身并不是“异步”。但是光标迭代是。

所以相反:

cursor = db.activities.aggregate(pipeline)
while (yield cursor.fetch_next):
    doc = cursor.next_object()
    print(doc)

就像文档说的那样。