我正在尝试在MongoDB中对字典进行排序。但是,我得到了值错误"太多的值无法解压缩"因为我认为这意味着每个字典中的值太多(每个字典中有16个值)。这是我的代码:
FortyMinute.find().sort(['Rank', 1])
任何人都知道怎么解决这个问题?
编辑:完全追溯
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
答案 0 :(得分:1)
您将解压缩中的参数和值传递给:
FortyMinute.find().sort('Rank', 1)
<小时/> 只有当您传递多个排序参数时,才能使用列表对参数和值进行分组,然后您必须使用元组包围所有参数,如下所示:
FortyMinute.find().sort([(Rank', 1), ('Date', 1)])
<小时/> 专业提示:即使下面链接的
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
答案 1 :(得分:0)
如果你想要mong / pymongo进行排序:
FortyMinute.find().sort('Rank', 1)
如果要使用多个字段进行排序:
FortyMinute.find().sort([('Rank': 1,), ('other', -1,)])
您还有一些常量可以让您更清楚自己在做什么:
FortyMinute.find().sort('Rank',pymongo.DESCENDING)
如果你想首先在python中排序,你必须返回结果并在python中使用排序方法:
sorted(FortyMinute.find(), key=<some key...>)