Comment trier mongodb avec pymongo
Je suis en train d'utiliser la fonctionnalité de tri lors de l'interrogation de mon mongoDB, mais c'est un échec. La même requête fonctionne dans la MongoDB console, mais pas ici. Le Code est comme suit:
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 j'obtiens est comme suit:
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 d'ailleurs qui dit que j'ai besoin de placer un " u " en face de la clé si vous utilisez pymongo, mais cela ne fonctionne pas non plus. Quiconque obtenir que cela fonctionne ou est-ce un bug.
Vous devez vous connecter pour publier un commentaire.
.sort()
, dans pymongo, prendkey
etdirection
en tant que paramètres.Donc, si vous souhaitez trier par, disons,
id
alors vous devriez.sort("_id", 1)
Pour de multiples domaines:
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
pour trier plusieurs champs.Vous pouvez essayer ceci:
Cela fonctionne aussi:
J'utilise dans mon code, s'il vous plaît commentaire si je fais quelque chose de mal ici, merci.
ASCENDING
etDESCENDING
depymongo
. 🙂Pourquoi python utilise la liste de tuples au lieu dict?
En python vous ne pouvez pas garantir que le dictionnaire sera interprété dans l'ordre que vous avez déclaré.
Donc dans le shell mongo vous pourriez faire
.sort({'field1':1,'field2':1})
et l'interprète doit trier champ1 au premier niveau et le champ 2 au deuxième niveau.Si ce sintax a été utilisé en python, il est possible de trier champ2 au premier niveau. Avec tuple il n'y a pas de risque.
Python utilise la clé,direction. Vous pouvez utiliser de la façon décrite ci-dessus.
Donc dans votre cas vous pouvez le faire