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 中命名查询的列表方法中排序不区分大小写
Grails findAll带有排序,顺序,最大值和偏移量?