Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序

Posted

技术标签:

【中文标题】Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序【英文标题】:Spring Boot, MongoDB, Pageable, sort by a custom method in the object 【发布时间】:2020-04-22 14:27:46 【问题描述】:

比如说我有以下设置,

这样的模型:

public class Post 

    @Id
    private String id;
    private String post;
    private List<Vote> votes = new ArrayList<>();

    // Getters & Setters...
    public double getUpVotes() 
        return votes.stream().filter(vote -> vote.getDirection() == 1).mapToInt(Vote::getDirection).count();
    

public class Vote 

    private short direction;

    // Getters & Setters...

然后是这样的存储库

@Repository
public interface PostRepository extends PagingAndSortingRepository<Post, String> 

    List<Post> findAll(Pageable pageable);

并说我想通过getter方法getUpVotes()的结果对帖子进行排序

我尝试了以下localhost:3005/opinion?page=0&amp;size=20&amp;sort=upVotes,但它不起作用。

【问题讨论】:

【参考方案1】:

排序文档可以指定对现有字段进行升序或降序排序 ...

https://docs.mongodb.com/manual/reference/method/cursor.sort/#sort-asc-desc

解决方法:您可以执行MongoDB aggregation,您可以在其中添加具有计算值的新字段并按此值排序:

db.post.aggregate([
  
    $addFields: 
      upVotes: 
        $size: 
          $filter: 
            input: "$votes.direction",
            cond: 
              $eq: [ "$$this", 1 ]
            
          
        
      
    
  ,
  
    $sort: 
      upVotes: 1
    
  
])

MongoPlayground | $project

弹簧数据

@Autowired
private MongoTemplate mongoTemplate;
...

Aggregation aggregation = Aggregation.newAggregation(addFields, sort);
List<Post> result = mongoTemplate
                       .aggregate(aggregation, mongoTemplate.getCollectionName(Post.class), Post.class)
                       .getMappedResults();

【讨论】:

以上是关于Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

Spring Boot + MongoDB

Spring Boot 整合 mongoDB 利用 JPA 方式交互

Spring Boot配置MongoDB连接池

Spring Boot MongoDB

Spring-boot数据mongoDB查询嵌套列表