2013-11-25 15 views
5

如何在使用MongoDB時訂購Grails criteria中的預測結果?Grails預測忽略了MongoDB的排序順序

似乎排序被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(正確):

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

結果與MongoDB的(錯誤):

["HTML5","CSS3","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:是的,我嘗試過,沒有parens,有和沒有方向。我甚至嘗試在條件中添加'order'。例如:'criteria = criteria.order(「order」)'在沒有'projection'的情況下,排序順序是正確的,所以看起來問題是在MongoDB上使用'projection'特有的。 –

+0

什麼是條件返回值'ids'中的ID的排序順序?如果您將'projection {id()}'更改爲?會做任何更改嗎? 'projection {property('id')}' – matcauthon

回答

1

的幻燈ctions支持已被重寫爲使用插件3.0中的MongoDb聚合框架。所以這個例子應該在3.0或者沒有排序的情況下工作。見https://jira.grails.org/browse/GPMONGODB-305

相關承諾https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d

+0

這聽起來不錯,但我還沒有能夠測試它。我們在列表字段上做了一些預測,但在3.0版中顯然不支持。當我們找出升級到3.0版本的方法時,我會發布更新。 –

+0

@Graeme Rocher我無法在這裏執行排序=> table.find(query).sort({「eventStartsAt」:-1})。skip(offset).limit(max) –