2013-11-25 22 views
5

Jak zamówić wyniki projekcji w Grails criteria podczas korzystania z MongoDB?Projekcje Grails ignorujące kolejność sortowania z MongoDB

Wygląda na to, że sortowanie jest ignorowane przez MongoDB. Poniższy kod poprawnie zwraca listę posortowanych tytułów książek po uruchomieniu z domyślną bazą danych HSQLDB w Grails. Przełączenie na MongoDB powoduje ignorowanie sortowania.

BookController.groovy

class BookController { 

    def library = [ 
     [author: "Jan", title: "HTML5"], 
     [author: "Lee", title: "CSS3"], 
     [author: "Sue", title: "JavaScript"] 
     ] 

    def titles() { 
     library.each { if (!Book.findByTitle(it.title)) new Book(it).save() } 
     def ids = Book.createCriteria().list() { 
     projections { id() } 
     order "title" 
     } 
     def titles = ids.collect { Book.get(it).title } 
     render titles as JSON 
     } 

} 

Wynik z domyślnym DB (poprawne):

["CSS3","HTML5","JavaScript"] 

Wynik z MongoDB (niewłaściwym):

["HTML5","CSS3","JavaScript"] 

Należy zauważyć, że powyższa książka przykład to tylko trochę trywialny kod ilustrujący problem. Prawdziwym celem jest wygenerowanie listy identyfikatorów domen posortowanych według pola domeny, aby domena mogła być iterowana w żądanej kolejności.

Rzeczywista domena, z którą mam do czynienia, jest zbyt duża, aby zmieścić się w pamięci. Innymi słowy, spowoduje to awarię aplikacji: Book.list().title.sort()

Poniżej znajdują się dodatkowe informacje dodatkowe.

Book.groovy

class Book {  
    String title 
    String author 
    static mapWith = "mongo" 
} 

BuildConfig.groovy

... 
compile ":mongodb:1.3.1" 
... 

DataSource.groovy

... 
grails { 
    mongo { 
     host = "localhost" 
     port = 27017 
     databaseName = "book-store" 
     } 
    } 
+0

Wszystkie przykłady mogę znaleźć porządek pokazując mają parametr w parens i to kierunek, jak zlecenia („tytuł”, „mal”) - Próbował pan jest? Czy kolejność jest poprawna, jeśli nie uwzględniasz prognoz? –

+0

@AsyaKamsky: Tak, próbowałem z i bez parens i zi bez kierunku. Próbowałem nawet dodać 'order' do kryteriów. Przykład: 'criteria = criteria.order (" order ")' Kolejność sortowania jest prawidłowa, gdy wykonano ją bez 'projekcji', więc wydaje się, że problemy dotyczą używania' projekcji' na MongoDB. –

+0

Jaka jest kolejność sortowania identyfikatorów w kryteriach zwracających wartość "ids"? A czy coś się zmieni, jeśli zmienisz "projekcje {id()}" na? 'projections {property ('id')}' – matcauthon

Odpowiedz

1

Proje Wsparcie dla ctions zostało przepisane, aby korzystać z frameworka agregacji MongoDb w wersji 3.0 wtyczki. A więc przykład, w którym powinien działać w wersji 3.0 z zamówieniem lub bez niego. Zobacz https://jira.grails.org/browse/GPMONGODB-305

Stosowna popełnić https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d

+0

To brzmi wspaniale, ale nie byłem jeszcze w stanie go przetestować. Wykonujemy kilka rzutów na pola listy, które najwyraźniej nie są obsługiwane w wersji 3.0. Kiedy wymyślimy sposób aktualizacji do wersji 3.0, opublikuję aktualizację. –

+0

@Graeme Rocher Nie mogę wykonać sortowania tutaj => table.find (query) .sort ({"eventStartsAt": -1}) .przesuń (offset) .limit (max) –

Powiązane problemy