使用 PyMongo 的 .sort 方法

24 浏览
0 Comments

使用 PyMongo 的 .sort 方法

使用PyMongo时,当我尝试按照它们的\'number\'和\'date\'字段对对象进行排序时,像这样:\n

db.test.find({"number": {"$gt": 1}}).sort({"number": 1, "date": -1})

\n我遇到了这个错误:\n

TypeError: 如果没有指定方向,则key_or_list必须是一个列表实例

\n我的排序查询有什么问题?

0
0 Comments

问题的原因是在使用PyMongo的.sort()方法时,传入的参数应该是一个键-方向对的列表,而不是一个字典。这是因为在Python的版本低于3.6时,字典是无序的,参数的顺序很重要。

解决这个问题的方法是将需要排序的键-方向对放入一个列表中作为.sort()方法的参数。如果只需要对一个字段进行排序,可以使用.sort("_id", 1)的方式。

在Python中,不能使用OrderedDict()来解决这个问题,因为OrderedDict()不是types.ListType的实例。

这个问题的解决方法对我帮助很大,因为《The Little MongoDB Book》中的排序示例是误导性的。

虽然有点可惜的是,MongoDB的官方文档示例使用字典而不是键-方向对的列表,但这样做对于PyMongo来说是有道理的。JSON实际上是有序字典(作为字符串),所以PyMongo的错误信息可能需要更清晰地说明需要改变的部分。

如果在Python3.6及以上的版本中,可以使用字典来解决这个问题,这样就可以向PyMongo提出一个拉取请求,使其与通用的MongoDB语法保持一致。当然,在旧版本的Python上运行PyMongo时,这种方法就不适用了。

如果想要对单个字段进行排序,还可以使用.sort('{}'.format('created_on'), 1 if sort_type == 'asc' else -1)的方式。

0