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?.
.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)])
Vous pouvez essayer ceci:
db.Account.find().sort("UserName")
db.Account.find().sort("UserName",pymongo.ASCENDING)
db.Account.find().sort("UserName",pymongo.DESCENDING)
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.
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)])
.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