使用Grails criteria时,如何在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 :(得分:1)
已经重写了投影支持,以便在3.0插件中使用MongoDb聚合框架。所以这个例子应该在3.0中有或没有订购。见https://jira.grails.org/browse/GPMONGODB-305
相关提交https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d