Usando .sort con PyMongo

109

Con PyMongo, cuando intento recuperar objetos ordenados por sus campos de 'número' y 'fecha' como este:

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

Me sale este error:

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

¿Qué pasa con mi consulta de clasificación?

KennyPowers
fuente

Respuestas:

206

sort debe ser una lista de pares clave-dirección, es decir

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

La razón por la que esto tiene que ser una lista es que el orden de los argumentos es importante y los dicts no están ordenados en Python <3.6

georg
fuente
29
La razón por la que esta es una lista en Python es que el orden de los argumentos para sort()asuntos y dictados no está ordenado en Python.
André Laszlo
@ AndréLaszlo ¿se puede usar un OrderedDict ()?
zakdances
9
Esto me ahorró un montón de investigación. El Libro Little MongoDB confunde en ejemplos de ordenación.
Dogukan Tufekci
4
Si es solo un campo, puede ser .sort ("_ id", 1)
Haris Np
2
en python3.6 + los dictados están ordenados, por lo que si alguien está dispuesto a hacerlo, podría valer la pena hacer una solicitud de extracción a pymongo para alinearlo con la sintaxis genérica de mongodb. Por supuesto, esto no funcionaría cuando se ejecuta pymongo en versiones anteriores de Python ..
thiezn