2012-04-09 14 views
8

Próbuję posortować kolekcję o nazwie user_score za pomocą klucza position i uzyskać pierwszy dokument z wynikiem. W tym przypadku kolekcja user_score nie istnieje i miałem nadzieję uzyskać wynik jako None, ale otrzymywałam kursor.sortowanie pymongo i find_one numer:

1. wynik =

db.user_score.find({'score':'$lt':score}}).sort("position,pymongo.DESCENDING").limit(1) 

Teraz zmieniłem zapytanie jak poniżej i nie dostać nic, jak oczekiwano.

2. wynik =

db.user_score.find_one({'score':{'$lt':score}}, sort=[("position", pymongo.DESCENDING)]) 

Jaki jest problem z moim pierwszym zapytaniu?

Dzięki

Odpowiedz

2

Jest to domyślne zachowanie mongodb na find. Za każdym razem, gdy używasz find, otrzymujesz listę wyników (w tym przypadku kursor iteracyjny). Tylko findOne - lub odpowiednik PyMongo find_one zwróci None, jeśli zapytanie nie ma odpowiedników.

9

W pierwszym zapytaniu, w funkcji sortowania podajesz jeden argument ("position,pymongo.DESCENDING"), kiedy powinieneś podawać dwa argumenty: ("position", pymongo.DESCENDING).

Pamiętaj o swoich cudzysłowach.

-1

Zastosowanie lista przekonwertować wartość kursora w dict:

list(db.user_score.find({'score':'$lt':score}}).sort("position",pymongo.DESCENDING).limit(1))[0]

+0

Tak też rozwiązałem. find_one nie bierze .sort, ale find() robi, więc sortowanie, ograniczanie i uzyskiwanie pierwszego elementu listy było drogą do zrobienia – pojda

0

trochę późno w mojej odpowiedzi, ale wydaje się, że obecna wersja PyMongo obsługuje operację sort na wezwanie find_one .

Od strony dokumentacji here (proszę grep sekcję dla find_one):

Wszystkie argumenty, aby znaleźć() są również ważne argumenty za find_one(), chociaż jakiś limit argumentem będą ignorowane. Zwraca pojedynczy dokument lub Brak, jeśli nie znaleziono zgodnego dokumentu.

Przykład użycia jest następujący:

filterdict = {'email' : '[email protected]'} 
collection.find_one(filterdict, sort=[('lastseen', 1)]) 

Nadzieja pomaga to nowsze wyszukiwarki!