2013-11-25 2 views
5

MongoDB을 사용할 때 Grails criteria의 투영 결과는 어떻게 주문합니까?MongoDB에서 정렬 순서를 무시하는 Grails 투영

MongoDB에서는 정렬 작업을 무시한 것으로 보입니다. 아래의 코드는 Grails 기본 메모리 상 HSQLDB 데이터베이스로 실행될 때 정렬 된 책 제목의 목록을 올바르게 반환합니다. MongoDB로 전환하면 정렬이 무시됩니다. 와

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 
     } 

} 

결과 기본 (올바른) DB :

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

참고 위의 책이 : MongoDB를 (잘못)와

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

결과 예제는 문제를 설명하기위한 단순한 코드입니다. 진짜 목표는 도메인이 원하는 순서대로 반복 될 수 있도록 도메인 필드별로 정렬 된 도메인 ID 목록을 생성하는 것입니다.

내가 다루는 실제 도메인이 너무 커서 메모리에 맞지 않습니다. 즉, 응용 프로그램이 다운됩니다. Book.list().title.sort()

다음은 추가 배경 정보입니다.

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

모든 예제는 괄호에있는 매개 변수가 방향, 순서처럼 ("제목", "ASC")를 포함 커밋 - 당신이 그것을 시도를? 또한 예상을 포함하지 않을 때 순서가 맞습니까? –

+0

@AsyaKamsky : 그래, 나는 괄호 안과없이, 그리고 방향을 가지고, 그리고 시도하지 않고 노력했다. 나는 심지어 기준에 '주문'을 추가하려고 시도했다. 예 :'criteria = criteria.order ("order")''projections '없이 끝나면 정렬 순서가 정확하므로 MongoDB에서'projections'를 사용하는 것과 관련하여 문제가있는 것처럼 보입니다. –

+0

기준 반환 값'ids'에있는 ID의 정렬 순서는 무엇입니까? 'projections {id()}'를 변경하면 무엇이 바뀌나요? 'projections {property ('id')}' – matcauthon

답변

1

proje 플러그인 3.0에서 MongoDb 집계 프레임 워크를 사용하도록 지원이 재 작성되었습니다. 따라서 어디서 주문을하든 안하든 3.0에서 작동해야하는 예제가 있습니다. 참조 https://jira.grails.org/browse/GPMONGODB-305

관련 내가 순서를 보여주는 찾을 수 있습니다 https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d

+0

소리가 훌륭하지만 아직 테스트 할 수 없습니다. 우리는 List 필드에 대해 몇 가지 예측을 수행하며 이는 v3.0에서 지원되지 않습니다. v3.0으로 업그레이드하는 방법을 찾으면 업데이트를 게시합니다. –

+0

@Graeme Rocher 여기에서 정렬을 수행 할 수 없습니다.> table.find (query) .sort ({ "eventStartsAt": -1}). skip (offset) .limit (max) –