【发布时间】:2013-12-09 21:27:58
【问题描述】:
在使用MongoDB 时,如何对Grails criteria 中的预测结果进行排序?
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
}
}
默认数据库的结果(正确):
["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"
}
}
【问题讨论】:
-
我能找到的所有显示 order 的示例都有括号中的参数并包括方向,例如 order("title","asc") - 你试过吗?另外,如果不包括投影,顺序是否正确?
-
@AsyaKamsky:是的,我试过带和不带括号,带和不带方向。我什至尝试将
order添加到标准中。示例:criteria = criteria.order("order")在没有projections的情况下完成排序顺序是正确的,因此问题似乎特定于在 MongoDB 上使用projections。 -
条件返回值
ids中id的排序顺序是什么?如果您将projections { id() }更改为 ,会有什么变化吗?projections { property('id') } -
@matcauthon,
id字段上的投影不能使用与其他字段相同的符号。id()符号似乎是要走的路。见:jira.grails.org/browse/GPMONGODB-249
标签: mongodb sorting grails groovy criteria