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

时间:2013-11-25 08:54:20

标签: mongodb sorting grails groovy criteria

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

1 个答案:

答案 0 :(得分:1)

已经重写了投影支持,以便在3.0插件中使用MongoDb聚合框架。所以这个例子应该在3.0中有或没有订购。见https://jira.grails.org/browse/GPMONGODB-305

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