J'essaie d'utiliser la fonction de tri lors de l'interrogation de mon mongoDB, mais cela é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 j'obtiens 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 dit que je dois placer un 'u' devant la clé si vous utilisez pymongo, mais cela n'a pas fonctionné non plus. N'importe qui d'autre fait fonctionner cela ou est-ce un bogue.
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
pour trier plusieurs champs.Vous pouvez essayer ceci:
la source
Cela fonctionne également:
J'utilise ceci dans mon code, veuillez commenter si je fais quelque chose de mal ici, merci.
la source
ASCENDING
etDESCENDING
depymongo
. :)Pourquoi python utilise la liste des tuples à la place dict?
En 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 le faire
.sort({'field1':1,'field2':1})
et l'interpréteur doit trier champ1 au premier niveau et champ 2 au deuxième niveau.Si ce sintax a été utilisé en python, il est possible de trier field2 au premier niveau. Avec tuple, il n'y a aucun risque.
la source
Python utilise la clé, la direction. Vous pouvez utiliser la méthode ci-dessus.
Donc, dans votre cas, vous pouvez le faire
la source
TLDR: Le pipeline d'agrégation est plus rapide que le pipeline conventionnel
.find().sort()
.Passons maintenant à la vraie explication. Il existe deux façons d'effectuer des opérations de tri dans MongoDB:
.find()
et.sort()
.Comme le suggèrent de nombreux .find (). Sort () est le moyen le plus simple d'effectuer le tri.
Cependant, il s'agit d'un processus lent par rapport au pipeline d'agrégation.
Venir à la méthode du pipeline d'agrégation. Les étapes pour implémenter un pipeline d'agrégation simple destiné au tri sont les suivantes:
REMARQUE: d'après mon expérience, le pipeline d'agrégation fonctionne un peu plus rapidement que la
.find().sort()
méthode.Voici un exemple de pipeline d'agrégation.
Essayez vous-même cette méthode, comparez la vitesse et faites-le moi savoir dans les commentaires.
Edit: N'oubliez pas d'utiliser
allowDiskUse=True
lors du tri sur plusieurs champs sinon cela générera une erreur.la source
Dites, vous voulez trier par champ 'created_on', alors vous pouvez faire comme ceci,
la source