Utiliser .sort avec PyMongo


109

Avec PyMongo, lorsque j'essaye de récupérer des objets triés par leurs champs «nombre» et «date» comme ceci:

db.test.find({"number": {"$gt": 1}}).sort({"number": 1, "date": -1})

J'obtiens cette erreur:

TypeError: if no direction is specified, key_or_list must be an instance of list

Quel est le problème avec ma requête de tri?

Réponses:


206

sort devrait être une liste de paires clé-direction, c'est-à-dire

db.test.find({"number": {"$gt": 1}}).sort([("number", 1), ("date", -1)])

La raison pour laquelle cela doit être une liste est que l'ordre des arguments est important et que les dicts ne sont pas ordonnés en Python <3.6


29
La raison pour laquelle il s'agit d'une liste en Python est que l'ordre des arguments des sort()sujets et des dictionnaires n'est pas ordonné en Python.
— André Laszlo

@ AndréLaszlo peut-on utiliser un OrderedDict ()?
— zakdances

9
Cela m'a sauvé une tonne de recherches. Le petit livre MongoDB induit en erreur dans les exemples de tri.
— Dogukan Tufekci

4
S'il ne s'agit que d'un seul champ, il peut s'agir de .sort ("_ id", 1)
— Haris Np

2
en python3.6 +, les dicts sont ordonnés, donc si quelqu'un est prêt à le faire, cela pourrait valoir la peine de demander à pymongo de le mettre en conformité avec la syntaxe générique mongodb. Bien sûr, cela ne fonctionnerait pas lors de l'exécution de pymongo sur des versions plus anciennes de python ..
— thiezn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.