项目中有使用到MongoDB,由于比较高频查询与写入,出现了每次查询的结果集都会变的问题。
我使用的是skip+limit的分页方式,模拟mysql的 limit 0,10去分页
由于出现了结果集变化的问题,我想着使用排序去固定返回的结果集,结果依旧不能如愿。究其原因是因为我的语句顺序问题
//这个aggregating用来分页
Aggregation pageAggregation = Aggregation.newAggregation(
//查询的字段
projectionOperation,
//条件
Aggregation.match(criteria),
Aggregation.group("deviceCode")
.sum("deviceUseDuration").as("useDuration")
.count().as("useNumber").last("deviceCode").as("deviceCode"),
Aggregation.skip((long) pageNum * pageSize),
Aggregation.sort(Sort.Direction.ASC,"deviceCode"),
Aggregation.limit(pageSize)
);
sort()根据deviceCode进行排序,由skip与limit进行分页。
结果sort只能排序当页的数据,原因是sort在skip后面,skip的作用是跳过指定行,先跳过后排序,那么结果肯定不尽人意。
//这个aggregating用来分页
Aggregation.sort(Sort.Direction.ASC,"deviceCode"),
Aggregation.skip((long) pageNum * pageSize),
Aggregation.limit(pageSize)
mongodb的排序分页是按照流形式去处理数据的,如果是先分页再排序,会导致数据只取前10条,然后在这10条数据里面排序,也就对应前端的效果是排序只对当前页面有效。包括如果使用了统计的方法,如果分页方法在此之前,也会导致先分页在排序的情况出现。因为如果使用了流,分页也会同步使用,尽量在使用流处理之前不分页。