2013-08-20 12 views
5

Używanie konsoli MongoDB mogę napisać natywną zapytanie MongoDB za pomocą odrębnego przycisku z pewnego rodzaju jak ten:kierowca MongoDB Java: odrębny z sortowania

db.mycollection.distinct('mykey').sort('mykey', 1) 

Używanie sterownika Java Spodziewam się, aby móc napisać samo zapytanie tak:

myCollection.distinct("myKey").sort(new BasicDBObject("myKey", 1)); 

jednak to nie działa, ponieważ DBCollection#distinct() powraca wpisać List a nie typu DBCursor jak DBCollection#find().

Jak mogę napisać oddzielne zapytanie sortowaniem za pomocą sterownika Java?

Odpowiedz

12

MongoDB nie obsługuje sortowania po stronie serwera za pomocą komendy distinct. Co się dzieje w konsoli, to wywołanie distinct('myKey') zwraca tablicę, a następnie wywołujesz metodę JavaScript sort w tej tablicy, która zwraca posortowaną wersję tablicy. Parametry przekazywane do sort są ignorowane.

Aby zrobić równowartość w Javie byłoby zrobić:

List myKeys = myCollection.distinct("myKey"); 
java.util.Collections.sort(myKeys); 

Aby uzyskać unikalne klucze używając po stronie serwera sortowania można użyć aggregate. Oto, jak można to zrobić w powłoce:

db.mycollection.aggregate([ 
    { $group: {_id: '$myKey' }}, 
    { $sort: {_id: 1}} 
]) 

Jednak kiedy to przetestowałem, proste podejście do sortowania po stronie klienta działało znacznie lepiej.

+0

Dzięki, ma sens. Zgaduję, że sortowanie po stronie klienta jest w porządku, chyba że dla dużej liczby wyników konieczna jest paginacja. (wróci i przekaże nagrodę później). –

0

Rzeczywiście można użyć czystym JavaScript

db.mycollection.distinct('mykey').sort() 

lub przekazać funkcję porównania dla bardziej rozbudowany Sortowanie:

db.users.distinct('mykey').sort(function(a, b){return a >b}) 

Testowane na robomongo