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?

KennyPowers
la source

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

Georg
la source
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