使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序

Posted

技术标签:

【中文标题】使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序【英文标题】:Sorting MongoDB results using Spring Boot with MongoTemplate 【发布时间】:2020-12-05 16:31:36 【问题描述】:

目标

我想要这个查询:

db.getCollection("employees").find().sort(
  hire_date: 1
).limit(10)

在 Spring Boot 中使用 MongoTemplate 编写。

研究

我看过很多关于排序的帖子和网站,例如

https://www.baeldung.com/java-mongodb-aggregations Spring + MongoDB - MongoTemplate + Criteria Query Spring MongoDB query sorting

尝试

我已经尝试了很多方法,但我仍然无法弄清楚如何才能做到这一点。下面列出了我尝试过的一些事情:

@Service
public class MongoService 

    @Autowired
    private MongoTemplate mongoTemplate;

    public Document simpleQuery() 

        // 1st
        mongoTemplate.aggregate(Arrays.asList(
                sort(Sorts.ascending("hire_date")),
                limit(10)
        ));

        // 2nd
        mongoTemplate.findAll(Employee.class).sort(new BasicDBObject("hire_date", 1));

        // 3rd
        mongoTemplate.findAll(Employee.class).sort((o1, o2) -> o1.getHire_date() > o2.getHire_date());

        // and more...
    

我想解决方案可能很简单,就像查询本身一样,但这是我在这种基础上的第一步。提前感谢您对此提供的任何帮助。

【问题讨论】:

这个答案对你有帮助吗? 很遗憾没时间试一试,我今天晚些时候去看看。 【参考方案1】:

试试这个,

Aggregation aggregation = Aggregation.newAggregation(
    sort(Sort.Direction.ASC, "hire_date"),
    limit(10)
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Employee.class), Object.class).getMappedResults();

【讨论】:

是的,它有帮助:) 但是有一个奇怪的行为 - 当我尝试自己编写它时它不允许我使用 allowDiskUse 但是当我复制粘贴你的答案时,它起作用了 让我知道为什么我们在这里使用allowDiskUsage 谢谢。这个***.com/a/37805720/7975771 的答案有明确的解释。如果您有任何疑问,请告诉我。我会尽力解决的【参考方案2】:

您可以按照以下方式进行操作。

    您需要一个查询部分
//As you need to match all
Query query = new Query()
    您需要添加排序选项
//You need to use Sort class with sorting order, field name to be used for sorting
query.with(new Sort(Sort.Direction.ASC, "hire_date"));
    您需要添加分页选项
final Pageable pageableRequest = PageRequest.of(0, 10);
query.with(pageableRequest);
    您需要添加模型
mongoTemplate(query, Employee.class)

Sample refer

Another useful answer

【讨论】:

以上是关于使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring boot 和 spring-boot-maven-plugin 生成战争时排除 application.properties

Spring —— Spring Boot 创建和使用

Spring Boot(十六):使用Jenkins部署Spring Boot

处理spring-boot-starter-quartz和spring-boot-starter-websocket同时使用报错

spring boot(十六)使用Jenkins部署spring boot

在 Tomcat 上使用 Spring Boot 进行身份验证