Grails预测忽略了MongoDB的排序顺序

Dem*_*ian 5 sorting grails groovy criteria mongodb

在使用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
      }

}
Run Code Online (Sandbox Code Playgroud)

默认DB的结果(正确):

   ["CSS3","HTML5","JavaScript"]
Run Code Online (Sandbox Code Playgroud)

MongoDB的结果(错误):

   ["HTML5","CSS3","JavaScript"]
Run Code Online (Sandbox Code Playgroud)

请注意,上面的书中的示例只是一些简单的代码来说明问题.真正的目标是生成按域的字段排序的域ID列表,以便可以按所需顺序迭代域.

我正在处理的实际域太大而无法放入内存中.换句话说,这会使应用程序崩溃:Book.list().title.sort()

以下是其他背景信息.

Book.groovy

class Book {    
   String title
   String author
   static mapWith = "mongo"
}
Run Code Online (Sandbox Code Playgroud)

BuildConfig.groovy

...
compile ":mongodb:1.3.1"
...
Run Code Online (Sandbox Code Playgroud)

DataSource.groovy的

...
grails {
   mongo {
      host = "localhost"
      port = 27017
      databaseName = "book-store"
      }
   }
Run Code Online (Sandbox Code Playgroud)

Gra*_*her 1

投影支持已被重写,以使用插件 3.0 中的 MongoDb 聚合框架。所以这个例子无论有没有排序都应该在 3.0 中工作。请参阅https://jira.grails.org/browse/GPMONGODB-305

相关提交https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d