mongo根据字段值进行排序,类似mysql的field函数功能

背景:现有一个字段state,字段值为1,2,3,4;现在列表页需要根据字段值进行排序,要求值为2的排在前面,其他状态的数据根据修改时间倒序展示,如果是mysql数据库可以直接使用field函数进行排序,但是现在使用的数据库为mongo,没有类似函数的支持,所以采用类似case when的方式实现该功能,主要代码如下:

import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators; import org.springframework.data.mongodb.core.aggregation.Fields; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import javax.annotation.Resource; @Repository public class UserDaoImpl implements UserDao {@Resource private MongoTemplate mongoTemplate; public Page getPage(Object param) { // 根据参数拼接查询条件,getQueryCriteria为内部方法,具体实现忽略 Criteria criteria = getQueryCriteria(param); Query query = Query.query(criteria); // 使用MongoTemplate查询总数 long total = mongoTemplate.count(query, UserPO.class); int pageNo = 1; int pageSize = 10; Pageable pageable = PageRequest.of(pageNo - 1, pageSize); // 生成冗余结果字段,如果字段值为2,赋值为1,其他值赋值为0 ConditionalOperators.Cond condOperation = ConditionalOperators.when(Criteria.where("state").is(2)) .thenValueOf("1") .otherwise("0"); // 计算skip值 long skip = (pageNo - 1) * pageSize; // 获取所有字段,getBaseFields为内部方法,具体实现忽略 Fields fields = getBaseFields(); Aggregation aggregation = Aggregation.newAggregation( // 将上面的state字段命名为sortNo Aggregation.project(fields).and(condOperation).as("sortNo"), Aggregation.match(criteria), // 先根据state倒序排序,再根据修改时间倒序排序,即可实现根据state的值进行排序,类似mysql field函数排序的功能 Aggregation.sort(Sort.by(Sort.Order.desc("sortNo"), Sort.Order.desc("modifiedAt"))), Aggregation.skip(skip), Aggregation.limit(pageSize)); AggregationResults resultList = mongoTemplate.aggregate(aggregation, UserPO.class, UserPO.class); return new PageImpl<>(resultList.getMappedResults(), pageable, total); } }

【mongo根据字段值进行排序,类似mysql的field函数功能】目前还没有其他更好的方法,如果有其他方式实现,请在评论中提出。

    推荐阅读