2014-12-30 3 views
0

Я пытаюсь сортировать словари в MongoDB. Тем не менее, я получаю ошибку значения «слишком много значений для распаковки», потому что я думаю, что это означает, что в каждом словаре имеется слишком много значений (в каждом из них 16 значений). Это мой код:ValueError: слишком много значений для распаковки

FortyMinute.find().sort(['Rank', 1]) 

Кто-нибудь знает, как обойти это?

EDIT: Полный отслеживающий

Traceback (most recent call last): 
    File "main.py", line 33, in <module> 
    main(sys.argv[1:]) 
    File "main.py", line 21, in main 
    fm.readFortyMinute(args[0]) 
    File "/Users/Yih-Jen/Documents/Rowing Project/FortyMinute.py", line 71, in readFortyMinute 
    writeFortyMinute(FortyMinData) 
    File "/Users/Yih-Jen/Documents/Rowing Project/FortyMinute.py", line 104, in writeFortyMinute 
    FortyMinute.find().sort(['Rank', 1])   
    File "/Users/Yih-Jen/anaconda/lib/python2.7/site-packages/pymongo/cursor.py", line 692, in sort 
    self.__ordering = helpers._index_document(keys) 
    File "/Users/Yih-Jen/anaconda/lib/python2.7/site-packages/pymongo/helpers.py", line 65, in  _index_document 
    for (key, value) in index_list: 
ValueError: too many values to unpack 
+1

Полный отслеживающий, пожалуйста? –

+0

Только что отредактировал мой вопрос, посмотрите там! – Yeej

+0

Что возвращает '' FortyMinute.find() '? –

ответ

1

Вы передаете аргументы и значение в распакованы, как так:

FortyMinute.find().sort('Rank', 1) 


только тогда, когда вы передаете несколько параметров сортировки, что вы аргументы группы и значение с с помощью списков, а затем вы тоже должны окружать все параметры с кортежем так:

FortyMinute.find().sort([(Rank', 1), ('Date', 1)]) 


Pro-наконечник: Даже Cursor.sort документации связаны ниже рекомендует использовать pymongo.DESCENDING и pymongo.ASCENDING вместо 1 и - 1; в общем, вы должны использовать описательные имена переменных вместо магических констант в коде, как так:

FortyMinute.find().sort('Rank',pymongo.DESCENDING) 


Наконец, если вы так склонны, вы можете сортировать список с помощью Python встроенных в качестве другого отвечающего упоминается; но даже мысль sorted принимает итераторы, а не только последовательности, может быть более неэффективным и нестандартным:

sorted(FortyMinute.find(), key=key_function) 

, где вы могли бы определить key_function вернуть Rank столбец записи.


Link to the official documentation

+0

Это возвращает эту ошибку: ТипError: если направление не указано, key_or_list должен быть экземпляром списка – Yeej

+0

@Yeej Попробуйте мой обновленный код. –

+0

@Yeej Не могли бы вы отправить трассировку с моим обновленным кодом? –

0

Если вы хотите реди/PyMongo сортировать:

FortyMinute.find().sort('Rank', 1) 

Если вы хотите отсортировать с помощью нескольких полей:

FortyMinute.find().sort([('Rank': 1,), ('other', -1,)]) 

Вы также константы, чтобы сделать более понятным, что вы делаете:

FortyMinute.find().sort('Rank',pymongo.DESCENDING) 

Если вы хотите отсортировать в питоне первых вы должны вернуть результат и использовать метод сортировки в Python:

sorted(FortyMinute.find(), key=<some key...>) 
+0

Эти исправления дают мне ту же ошибку. – Yeej

+0

@Yeej Что делает простой 'FortyMinute.find()' return? –

+0

FortMinute.find() работает просто отлично, потому что я использую его в цикле for для доступа к каждому словарю при печати в текстовый файл. – Yeej

Смежные вопросы