如何使用Pageable按地图值排序

时间:2019-05-17 14:58:37

标签: mongodb spring-boot sorting pageable

我有一个带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 个答案:

答案 0 :(得分:1)

当您使用http://localhost:8080?sort=values,DESC进行排序时,Mongo将按照以下顺序比较BSON:

  1. MinKey(内部类型)
  2. 数字(整数,多位和双精度)
  3. 符号,字符串
  4. 对象
  5. 数组
  6. BinData
  7. ObjectId
  8. 布尔值
  9. 日期
  10. 时间戳
  11. 正则表达式
  12. MaxKey(内部类型)

关于使用嵌套属性,我不知道您使用的是哪个版本,但是存在关于对嵌套属性进行排序的问题:https://jira.spring.io/browse/DATAREST-976?jql=text%20~%20%22sort%20nested%22%20ORDER%20BY%20created%20DESC