web-dev-qa-db-fra.com

Comment trier mongodb avec pymongo

J'essaie d'utiliser la fonctionnalité de tri lors de l'interrogation de ma mongoDB, mais elle échoue. La même requête fonctionne dans la console MongoDB mais pas ici. Le code est le suivant:

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

L'erreur que je reçois est la suivante:

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

J'ai trouvé un lien ailleurs qui indique que je dois placer un "u" devant la clé si j'utilise du pymongo, mais cela n'a pas fonctionné non plus. Quelqu'un d'autre veut que cela fonctionne ou est-ce un bug?.

147
WildBill

.sort(), dans pymongo, prend key et direction en tant que paramètres.

Donc, si vous voulez trier par, disons, id alors vous devriez .sort("_id", 1)

Pour plusieurs champs:

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

Vous pouvez essayer ceci:

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

Cela fonctionne aussi:

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

J'utilise ceci dans mon code, veuillez commenter si je fais quelque chose de mal ici, merci.

13
Snehal Parmar

Pourquoi python utilise la liste de tuples à la place dict?

Dans python, vous ne pouvez pas garantir que le dictionnaire sera interprété dans l'ordre que vous avez déclaré.

Ainsi, dans mongo Shell, vous pouvez faire .sort({'field1':1,'field2':1}) et l'interprète doit trier le champ 1 au premier niveau et le champ 2 au deuxième niveau.

Si cette syntaxe était utilisée en python, il est possible de trier field2 au premier niveau. Avec Tuple, il n'y a aucun risque.

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

Python utilise la clé, la direction. Vous pouvez utiliser la méthode ci-dessus.

Donc, dans votre cas, vous pouvez le faire

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