如何在使用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"
}
}
所有我能找到的顯示順序的例子有一個括號的參數,包括方向,如訂單(「稱號」,「ASC」) - 你試過了嗎?另外,當您不包含投影時,該命令是否正確? –
@AsyaKamsky:是的,我嘗試過,沒有parens,有和沒有方向。我甚至嘗試在條件中添加'order'。例如:'criteria = criteria.order(「order」)'在沒有'projection'的情況下,排序順序是正確的,所以看起來問題是在MongoDB上使用'projection'特有的。 –
什麼是條件返回值'ids'中的ID的排序順序?如果您將'projection {id()}'更改爲?會做任何更改嗎? 'projection {property('id')}' – matcauthon