如何使用 Pageable 按地图值排序
Posted
技术标签:
【中文标题】如何使用 Pageable 按地图值排序【英文标题】:How to sort by map values with Pageable 【发布时间】:2019-05-17 14:58:36 【问题描述】:我有一个带有 REST 控制器的 SpringBoot 应用程序,我需要按实体属性(包括地图值)进行排序。
这是我的实体类:
@Document
data class Event(
@Id
val id: CompoundId,
@Indexed
val timestamp: Instant,
val description: String,
val values: Map<String, Any> = HashMap()
)
我的 REST 控制器 GET:
@GetMapping("/")
fun getEvents(
@PageableDefault(sort = ["timestamp"], direction = Sort.Direction.ASC)
pageable: Pageable?
): Collection<Event> = mongoRepository.find(pageable)
另外,我使用 MongoDB:
override fun find(pageable: Pageable?): Collection<Event>
Query().apply
pageable?.let with(pageable)
return mongoTemplate.find(this, Event::class.java)
我正在尝试发出这样的请求:http://localhost:8080?sort=values,DESC
,我看到顺序已更改,但我无法理解它对哪些参数进行了排序。
是否可以使用Pageable
,如http://localhost:8080?sort=values.someKeyInTheMap,DESC
,按地图参数排序?
【问题讨论】:
【参考方案1】:当您使用http://localhost:8080?sort=values,DESC 进行排序时,Mongo 将按照以下顺序比较 BSON:
-
MinKey(内部类型)
空
数字(整数、长整数、双精度数)
符号、字符串
对象
数组
BinData
对象标识
布尔值
日期
时间戳
正则表达式
MaxKey(内部类型)
关于使用嵌套属性,不知道你用的是什么版本,但是对嵌套属性排序有个问题:https://jira.spring.io/browse/DATAREST-976?jql=text%20~%20%22sort%20nested%22%20ORDER%20BY%20created%20DESC
【讨论】:
以上是关于如何使用 Pageable 按地图值排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?