2014-06-09 2 views
1

меня возникают трудности с функцией агрегации Мотор давая no fetch_next Exceptionпитон двигатель предлагает fetch_next исключение на агрегацию

Код

cursor = db[collection].aggregate(myPipeline, cursor = {}) 

if (yield cursor.fetch_next): 
    obj = bson.json_util.dumps(cursor.next_object()) 
    self.write(obj) 

что рыгнул до следующей

Исключение: : Объект TracebackFuture не имеет атрибута 'fetch_next'

Тогда я попробовал следующее, который был найден в SO вопрос

cursor = yield motor.Op(db[collection].aggregate, x_query) 

который предложил то же самое исключение.

Запуск агрегата в Монго оболочки производит результат добросовестного

"result" : [ 
    { 
     "_id" : "Adam", 
     "num" : 110 
    }, 
    { 
     "_id" : "Argyle", 
     "num" : 77 
    }, 
    { 
     "_id" : "Net Valley", 
     "num" : 67 
    }, 
    { 
     "_id" : "Notts Farm", 
     "num" : 64 
    }, 
    { 
     "_id" : "Sam's Place", 
     "num" : 59 
    }, 
    { 
     "_id" : "Tilly", 
     "num" : 58 
    }, 
    { 
     "_id" : "Xavier", 
     "num" : 52 
    } 
], 
"ok" : 1 

Motor не предложил ничего подобного вопроса с find и `find_one. На самом деле, он отлично работает в противном случае.

Установка была выполнена через pip install motor на Ubuntu.

Приветствия

ответ

3

Я извиняюсь, the documentation неправильно. «Агрегат» возвращает будущее, и вы должны дать будущее, чтобы получить курсор:

cursor = yield db[collection].aggregate(myPipeline, cursor={}) 

if (yield cursor.fetch_next): 
    obj = bson.json_util.dumps(cursor.next_object()) 
    self.write(obj) 

Я сам себя назначил билет, MOTOR-34, отслеживать этот вопрос для следующего релиза.

+0

Эй, спасибо за головы. И спасибо большое за Мотор. Это невероятно. Im, предполагающий, что вам действительно нужен только cursor.fetch_next один раз в агрегации (дайте результат в объекте результата первой выборки) –

+0

Собственно, если вы используете MongoDB 2.6, и вы передаете «cursor = {}», аргумент с двигателем, то «aggregate» возвращает реальный курсор, который передает вам результаты, как и find(). Таким образом, fetch_next/next_object работает одинаково для агрегации: fetch_next будет извлекать следующую партию * иногда *, когда текущая партия исчерпана (каждые 4 МБ данных). next_object() выдает следующий документ из партии. –

+0

кстати. просто следовать совету и кажется, что предоставление курсора недействительно ('cursor', {})]) failed: непризнанное поле "cursor –