MongoDB 2.4聚合错误:产生未知对象MotorAggregationCursor

时间:2016-03-24 09:02:15

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

这不是一个重复的问题另一个问题与Mongo 2.6有关,它的汇总与Mongo 2.4有很大不同。我已经阅读了另一个问题,甚至在这个问题的最后一段解决了这个问题。

首先,我对Mongo很新,甚至更新到PyMongo。我正在使用现有脚本并尝试调试它不能在本地运行的原因。以下查询会导致错误。

查询:

[{
  u'$match': {
    u'geocode.co_iso2': u'US',
    u'brand._id': UUID('xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
  }
},
{
  u'$group': {
    u'_id': u'$brand._id',
    u'num': {u'$sum': 1}
  }
},
{
  u'$sort': {u'num': -1}
},
{
  u'$limit': 100000
}]

代码:

cursor = yield db[collection].aggregate(bsonQuery)
self.write(bson.json_util.dumps(cursor))

错误:

Exception: <class 'tornado.gen.BadYieldError'>:yielded unknown object MotorAggregationCursor(<motor.core._LatentCursor object at 0x10a897b50>)

我还想注意这是Mongo 2.4和PyMongo 2.8。我知道一些有类似错误的人被告知要在没有cursor的情况下存储yield,然后执行while(yield...)。试过,似乎不适用于Mongo 2.4。它说:

Exception: <class 'pymongo.errors.OperationFailure'>:command SON([('aggregate', u'MyCollection'), ('pipeline', [{u'$match': {u'geocode.co_iso2': u'US', u'brand._id': UUID('xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')}}, {u'$group': {u'_id': u'$brand._id', u'num': {u'$sum': 1}}}, {u'$sort': {u'num': -1}}, {u'$limit': 100000}]), (u'cursor', {})]) on namespace mydatabase.$cmd failed: unrecognized field "cursor

1 个答案:

答案 0 :(得分:1)

我实际上是想将它添加到它cousin question,因为MongoDB 2.4可以特别抛出此错误的另一个原因。

简单地说&#34;游标&#34; MongoDB 2.4不支持聚合结果。这意味着您需要专门打开该选项&#34;关闭&#34;,从而使.aggregate()成为&#34;异步&#34;方法调用本身,返回的结果现在是一个包含可枚举数组"results"

的文档
reply = yield collection.aggregate(pipeline,cursor=False)
for doc in reply['results']:
    print(doc)

因此,调用中缺少的cursor=False使其成为&#34; async&#34;。