如何用pymongo对mongodb进行排序

时间:2011-11-13 02:13:59

标签: python mongodb pymongo

我正在尝试在查询我的mongoDB时使用排序功能,但它失败了。相同的查询在MongoDB控制台中有效但在此处不起作用。代码如下:

import pymongo

from  pymongo import Connection
connection = Connection()
db = connection.myDB
print db.posts.count()
for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({u'entities.user_mentions.screen_name':1}):
    print post

我得到的错误如下:

Traceback (most recent call last):
  File "find_ow.py", line 7, in <module>
    for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({'entities.user_mentions.screen_name':1},1):
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/cursor.py", line 430, in sort
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/helpers.py", line 67, in _index_document
TypeError: first item in each key pair must be a string

我在其他地方找到了一个链接,说如果使用pymongo,我需要放置一个'u'的钥匙,但这也不起作用。其他任何人都可以使用它或者这是一个错误。

9 个答案:

答案 0 :(得分:275)

在pymongo中,

.sort()keydirection作为参数。

因此,如果您想要排序,比方说id那么您应该.sort("_id", 1)

适用于多个字段:

.sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)])

答案 1 :(得分:32)

你可以试试这个:

db.Account.find().sort("UserName")  
db.Account.find().sort("UserName",pymongo.ASCENDING)   
db.Account.find().sort("UserName",pymongo.DESCENDING)  

答案 2 :(得分:13)

这也有效:

db.Account.find().sort('UserName', -1)
db.Account.find().sort('UserName', 1)

我在我的代码中使用了这个,如果我在这里做错了,请评论,谢谢。

答案 3 :(得分:6)

为什么python使用元组列表而不是dict?

在python中,您无法保证字典将按您声明的顺序进行解释。

因此,在mongo shell中你可以.sort({'field1':1,'field2':1}),解释器应该在第一级对field1进行排序,在第二级对第2级进行排序。

如果在python中使用了这个sintax,则有可能在第一级对field2进行排序。使用元组没有风险。

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

答案 4 :(得分:2)

_id 降序排序:

collection.find(filter={"keyword": keyword}, sort=[( "_id", -1 )])

_id 升序排序:

collection.find(filter={"keyword": keyword}, sort=[( "_id", 1 )])

答案 5 :(得分:1)

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

Python使用键,方向。您可以使用上述方式。

所以在你的情况下你可以这样做

for post in db.posts.find().sort('entities.user_mentions.screen_name',pymongo.ASCENDING):
        print post

答案 6 :(得分:0)

TLDR:与传统的.find().sort()相比,聚合管道更快。

现在转到真正的解释。在MongoDB中有两种执行排序操作的方法:

  1. 使用.find().sort()
  2. 或使用聚合管道。

许多.find()建议,sort()是执行排序的最简单方法。

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

但是,与聚合管道相比,这是一个缓慢的过程。

来到聚合管道方法。实现用于排序的简单聚合管道的步骤为:

  1. $ match(可选步骤)
  2. $ sort

注意:根据我的经验,聚合管道的工作速度比.find().sort()方法要快。

这是聚合管道的示例。

db.collection_name.aggregate([{
    "$match": {
        # your query - optional step
    }
},
{
    "$sort": {
        "field_1": pymongo.ASCENDING,
        "field_2": pymongo.DESCENDING,
        ....
    }
}])

自己尝试这种方法,比较速度,然后在评论中让我知道。

编辑:在对多个字段进行排序时,请不要忘记使用allowDiskUse=True,否则会引发错误。

答案 7 :(得分:0)

说,您想按“ created_on”字段排序,那么您可以这样做,

.sort('{}'.format('created_on'), 1 if sort_type == 'asc' else -1)

答案 8 :(得分:0)

降序和升序:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
col = db["customers"]

doc = col.find().sort("name", -1) #

for x in doc:
  print(x)

###################

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
col = db["customers"]

doc = col.find().sort("name", 1) #

for x in doc:
  print(x)