Używanie .sort z PyMongo

109

Z PyMongo, kiedy próbuję pobrać obiekty posortowane według ich pól „numer” i „data” w następujący sposób:

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

Otrzymuję ten błąd:

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

Co jest nie tak z moim zapytaniem sortowania?

KennyPowers
źródło

Odpowiedzi:

206

sort to znaczy, powinna być listą par klucz-kierunek

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

Powodem, dla którego to musi być lista, jest to, że kolejność argumentów ma znaczenie i dictnie są uporządkowane w Pythonie <3.6

Georg
źródło
29
Powodem, dla którego jest to lista w Pythonie, jest to, że kolejność argumentów sort()spraw i nakazów nie jest uporządkowana w Pythonie.
André Laszlo
@ AndréLaszlo Czy można użyć OrderedDict ()?
zakdances
9
To zaoszczędziło mi mnóstwo badań. The Little MongoDB Book wprowadza w błąd przykłady sortowania.
Dogukan Tufekci
4
Jeśli jest to tylko jedno pole, może to być .sort ("_ id", 1)
Haris Np
2
w python3.6 + dicts są uporządkowane, więc jeśli ktoś jest na to gotowy, warto wysłać żądanie ściągnięcia do pymongo, aby dostosować je do generycznej składni mongodb. Oczywiście to nie zadziała, jeśli uruchomisz pymongo na starszych wersjach Pythona ...
thiezn