Grails投影忽略MongoDB的排序顺序

Posted

技术标签:

【中文标题】Grails投影忽略MongoDB的排序顺序【英文标题】:Grails projections ignoring sort order with MongoDB 【发布时间】: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 【参考方案1】:

在插件的 3.0 中,已重写投影支持以使用 MongoDb 聚合框架。因此,无论是否订购,都应该在 3.0 中工作的示例。见https://jira.grails.org/browse/GPMONGODB-305

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

【讨论】:

这听起来不错,但我还不能测试它。我们对 List 字段进行了一些预测,这显然在 v3.0 中不受支持。当我们找到升级到 v3.0 的方法时,我会发布更新。 @Graeme Rocher 我无法在此处执行排序 => table.find(query).sort( "eventStartsAt" : -1 ).skip(offset).limit(max)

以上是关于Grails投影忽略MongoDB的排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB 在 Grails 中命名查询的列表方法中排序不区分大小写

MongoDB 索引和投影

在 Grails/GORM 中定义默认排序顺序

Grails findAll带有排序,顺序,最大值和偏移量?

Grails Scaffolding 的 MongoDB 问题(在 MySQL 中不会发生)

Java Spring Data Mongodb 1.10 排序忽略案例